【问题标题】:Using openpyxl to compare and modify columns from different files使用 openpyxl 比较和修改来自不同文件的列
【发布时间】:2020-08-25 22:17:15
【问题描述】:

我正在编写一个执行以下操作的程序:

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-

非常感谢任何帮助!

【问题讨论】:

  • 没有足够的信息来确定解决方案。 CSV 和 Excel 工作表中有哪些列?哪一列是进行匹配的关键字段?

标签: python excel csv openpyxl


【解决方案1】:

此代码应该会得到您正在寻找的结果。它打开 csv 和 excel 文件并根据 csv 中的关键列更新 excel 文件。如果没有找到匹配的键列,则追加一行。

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

之前

之后

【讨论】:

  • 我收到“ValueError: could not convert string to float: 'Utility' from line 21: ws.cell(xr + 1, curcol).value = float(row[2]) -如果我删除浮点转换,同一行会引发错误“IndexError:列表索引超出范围”
  • 您的 CSV 缺少一列。
  • col1,col2,col3,col4,col5,col6 日期,----,1-Jun,1-Jul,1-Aug,1-Sep typ1,asdf,11,1313,432 , typ2,fdsa,0,245,12, typ3,asdfasd,114,52345,2224, 是我用的
  • 我更新了脚本以创建 csv,以便您进行比较
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多