#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