使用 openpyxl 比较和修改来自不同文件的列
Using openpyxl to compare and modify columns from different files
我正在编写一个执行以下操作的程序:
1.) 从另一个脚本读取包含经过处理的格式化数据的 CSV 文件
2.) 将 CSV 中的数据与用于跟踪随时间变化趋势的 XLSX 文件进行比较,按 sheet 排序;如果 CSV 中的数据类别在 XLSX 中尚不存在,它将将该类别添加到相应 sheet 的底部;然后它应该输入从 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 迭代特定 [= 上的特定列38=] 用于比较。
-更新-
回复“没有提供足够的信息来确定解决方案。CSV 和 excel sheet 中有哪些列?哪个列是关键字段匹配吗?
关键字段是类型 - 它们将在 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 文件并根据 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')
之前
之后
我正在编写一个执行以下操作的程序:
1.) 从另一个脚本读取包含经过处理的格式化数据的 CSV 文件
2.) 将 CSV 中的数据与用于跟踪随时间变化趋势的 XLSX 文件进行比较,按 sheet 排序;如果 CSV 中的数据类别在 XLSX 中尚不存在,它将将该类别添加到相应 sheet 的底部;然后它应该输入从 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 迭代特定 [= 上的特定列38=] 用于比较。
-更新-
回复“没有提供足够的信息来确定解决方案。CSV 和 excel sheet 中有哪些列?哪个列是关键字段匹配吗?
关键字段是类型 - 它们将在 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 文件并根据 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')
之前
之后