#python #excel #csv #openpyxl
#python #excel #csv #openpyxl
Вопрос:
Я пишу программу, которая выполняет следующее:
1.) Прочитайте файл CSV, содержащий обработанные форматированные данные, из другого скрипта
2.) Сравните данные из CSV с файлом XLSX, который используется для отслеживания тенденций с течением времени, отсортированных по листам; если категории данных из CSV еще не существуют в XLSX, эта категория будет добавлена в нижнюю часть соответствующего листа; затем следует ввести соответствующие числовые значения из CSV в конец строки в XLSX
Вот что у меня есть до сих пор:
import csv
import openpyxl
logfile = 'logbook.xlsx'
wb = openpyxl.load_workbook(logfile)
with open ('working.csv', 'r') as csvfile:
infile = csv.reader(csvfile, delimiter=',')
for col in infile:
if col[1] == 'typeCol':
list = []
list.append(col[3])
ws = wb['typeCol']
Это позволит прочитать нужный столбец и добавить уникальные типы записей в список.
Что я хочу сделать сейчас, так это сравнить этот список с определенным столбцом в logbook.xlsx однако я не могу понять, как заставить openpyxl выполнять итерации по определенному столбцу на определенном листе для сравнения.
-ОБНОВИТЬ-
В ответ на ответ «Недостаточно предоставленной информации для определения решения. Какие столбцы находятся в CSV и на листе Excel? Какой столбец является ключевым полем для сопоставления?»
Ключевое поле — это тип — они будут точно совпадать как в CSV, так и в Excel.
Столбцы CSV и Excel будут содержать комбинацию букв и цифр и, возможно, символов, так что на самом деле все, что угодно. Пример:
CSV:
Col1 Col2 Col3
typ1 asdf 1300
typ2 b14f 150
typ3 a8-j 11
XLSX:
Col1 Col2 Col3 Col4 Col5 Col6 SEP1 col populated by corresponding #'s
date ---- JUN1 JUL1 AUG1 SEP1 from CSV above
typ1 asdf 10 955 756
typ2 b14f 0 6191 3435
typ3 z1z9 919 0 1499
-GENERATE TYP3 FROM CSV HERE AS NEW ROW-
Любая помощь приветствуется!
Комментарии:
1. Для определения решения недостаточно предоставленной информации. Какие столбцы находятся в CSV и на листе Excel? Какой столбец является ключевым полем для сопоставления?
Ответ №1:
Этот код должен получить результат, который вы ищете. Он открывает файл csv и Excel и обновляет файл Excel в соответствии с ключевыми столбцами в CSV. Если соответствующие ключевые столбцы не найдены, добавляется строка.
# Create CSV for test
cdata = '''
Col1 Col2 Col3
typ1 asdf 1300
typ2 b14f 150
typ3 a8-j 11
'''.strip()
with open ('working.csv', 'w') as csvfile:
csvfile.write(cdata)
###################### Main Script ##########################
import csv
import openpyxl
logfile = 'logbook.xlsx'
wb = openpyxl.load_workbook(logfile)
ws = wb.worksheets[0]
curcol = 6 # SEP1
with open ('working.csv', 'r') as csvfile:
infile = csv.reader(csvfile, delimiter=' ')
for i, row in enumerate(infile):
if i==0: continue # skip headers
for xr in range(3, ws.max_row 1): # check excel sheet
if ws.cell(xr,1).value == row[0] and ws.cell(xr,2).value == row[1]: # key columns match
ws.cell(xr,curcol).value = float(row[2]) # copy csv value
break # found entry
else: # did not find entry, must add row
ws.cell(xr 1, 1).value = row[0]
ws.cell(xr 1, 2).value = row[1]
ws.cell(xr 1, curcol).value = float(row[2])
wb.save('logbookNew.xlsx')
Перед
После
Комментарии:
1. Я получаю «ValueError: не удалось преобразовать строку в float: ‘Utility’ из строки 21: ws.cell (xr 1, curcol). значение = с плавающей точкой (строка [2]) — если я удалю преобразование с плавающей точкой, в той же строке появится ошибка «ошибка индекса: индекс списка вне диапазона»
2. В вашем CSV отсутствует столбец.
3. col1, col2, col3,col4,col5, col6 дата,—-, 1 июня, 1 июля, 1 августа, 1 сентября typ1, asdf, 11,1313, 432, typ2, fdsa, 0,245, 12, typ3, asdfasd, 114, 52345, 2224 — это то, что я использую
4. Я обновил скрипт для создания csv, чтобы вы могли сравнивать