Использование openpyxl для сравнения и изменения столбцов из разных файлов

#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')  
  

Перед

BeforeUpdate

После

AfterUpdate

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

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, чтобы вы могли сравнивать