Преобразование CSV в Excel с помощью Python

#python #excel #csv #openpyxl

#python #excel #csv #openpyxl

Вопрос:

Я написал фрагмент кода, который анализирует файл .csv и сохраняет данные в формате Excel. Проблема в том, что все мои данные в Excel отображаются как «число, сохраненное в виде текста», и мне нужно, чтобы данные, начинающиеся со столбца 3, были преобразованы в числовой тип, чтобы я мог представить их с помощью диаграммы. Моя таблица выглядит примерно так:

     C1     C2       C3
R1  BlaBla          36552.00233102 ...
R2         App1     3484.000000000 ...
R3         App2     3399.000000000 ...
.....................................
 

и это код:

 f = open("csv_file")
wb = openpyxl.Workbook()
ws = wb.active
reader = csv.reader(f, delimiter=',')
for i in reader:
    ws.append(i)

f.close()
wb.save("excel_file")
 

Ответ №1:

Содержит ли ваш CSV-файл числовые элементы, заключенные в кавычки? Если это так, это приведет к тому, что вы видите. Например, рассмотрим это:

 import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
for i in [['100', 100]]:
    ws.append(i)    
wb.save("excel_file.xlsx")
 

str Значение записывается как текстовый элемент в Excel, а int значение записывается как число. Если ваш файл CSV содержит

 "100", 100
 

csv будет интерпретировать это как строку и число.

Вы можете преобразовать все, что находится в третьем столбце и далее, из вашего csv файла, добавив:

 i[2:] = [float(x) for x in i[2:]]
 

в строку прямо перед добавлением i в рабочую книгу.

Комментарии:

1. Я добавил i[2:] = [float(x) для x в i[2:]], как вы сказали, и работает отлично.

2. Упс! Извините. Исправлено в моем ответе.

3. Стоит отметить, что в openpyxl есть возможность для рабочих книг «угадывать» тип значения, который, вероятно, сработает в этом случае. Но я всегда рекомендую вам обрабатывать преобразование самостоятельно. wb.guess_types=True это синтаксис.

Ответ №2:

Если вы не определили, какой столбец является плавающим, вы можете попытаться преобразовать значение в значение с плавающей точкой с помощью обработчика исключений. Код может стать:

 reader = csv.reader(f, delimiter=',')
for i in reader:
    try:
        ws.append(float(i))
    except ValueError:
        ws.append(i)

f.close()
 

Ответ №3:

Я предлагаю использовать pandas pandas.read_csv и pandas.to_excel