美好的一天。有多个大型Excel文件(280,000多行)。在它们的每一个中,都有一个具有唯一ID的列和一个具有与每个ID对应的值的列。第一个文件的ID必须将与该ID对应的值与第二个文件中的值进行比较,如果它们不相等,则将第三个文件中的值与第五个文件进行比较,以此类推。如果找不到相等的值,则有必要将ID及其值写入新的excel文件。 示例:
(first excel file) (second excel file)
ID Value ID Value
1 100 2 200
2 200 3 888
3 300 1 100
程序有必要比较每个ID的值,并将不匹配的ID及其值写入第三个文件(在本例中为3和888或3和300)
我使用openpyxl编写了一个python程序,但是当我尝试向字典中写入一组值时,该程序挂起并且计算机的内存不足。
import openpyxl
import os
os.getcwd()
def xls_to_dict(filename, max_row):
print('Opening file' + filename)
wb = openpyxl.load_workbook(filename)
sheet = wb.get_sheet_by_name('Sheet1')
data_dict = {}
for row in range(2, max_row + 1):
data_dict[sheet['B' + str(row)].value] = sheet['X' + str(row)].value
return data_dict
def dict_to_xls(data_dict):
wb = workbook()
sheet = wb.active
for next_row in range(1, len(data_dict) + 1):
policy_id, current = data_dict.popitem()
sheet.cell(column = 1, row = next_row, value = policy_id)
sheet.cell(column = 2, row = next_row, value = current)
return wb
insis_dict = xls_to_dict('ALF_T_REP_PROFIT.xlsx', 253840)
qlik_20_dict = xls_to_dict('Qlik - 20.05.2019', 230725)
qlik_21_dict = xls_to_dict('Qlik - 21.05.2019', 230725)
qlik_22_dict = xls_to_dict('Qlik - 22.05.2019', 230725)
qlik_23_dict = xls_to_dict('Qlik - 23.05.2019', 230725)
empty_polices = {}
diff_polices = {}
for key in insis_dict:
if key not in qlik_20_dict:
diff_polices[key] = insis_data[key]
continue
if insis_dict[key] == qlik_20_dict[key]:
continue
elif insis_dict[key] == qlik_21_dict[key]:
continue
elif insis_dict[key] == qlik_22_dict[key]:
continue
elif insis_dict[key] == qlik_23_dict[key]:
continue
else:
empty_polices[key] = insis_data[key]
dict_to_xls(empty_polices).save('empty_polices.xlsx')
dict_to_xls(diff_polices).save('diff_polices.xlsx')
还有其他方法可以比较不同excel文件中每个ID的值并在新的excel文件中记录差异吗?也许有人知道如何使用内置的excel工具来做到这一点?
答案 0 :(得分:-1)
设置:csv 文件,而不是excel文件。
import io, csv
s = '''ID,Value
1,100
2,200
3,300
4,400'''
base = io.StringIO(s)
s = '''ID,Value
2,200
3,888
1,100
4,222'''
f2 = io.StringIO(s)
s = '''ID,Value
4,333
2,200
3,888
1,100'''
f3 = io.StringIO(s)
通读基本文件并创建字典
d = {}
reader = csv.reader(base)
next(reader)
for k,v in reader:
d[k] = v
通读其他文件;如果找到 match ,则将Id
放入一组
found = set()
for f in [f2,f3]:
reader = csv.reader(f)
next(reader)
for k,v in reader:
if d[k] == v:
found.add(k)
使用未找到的Id
,使用基础词典中的Value
创建一个新文件。
missing = io.StringIO()
writer = csv.writer(missing)
writer.writerow(['Id','Value'])
for key in found.symmetric_difference(d):
writer.writerow([key,d[key]])
这可能更好。通读基本文件,并将(ID,value)
元组放入集合中。通读其他文件;如果找到 match ,则从集合中删除该元组。将集合中所有剩余的元组写入一个新文件。
reader = csv.reader(base)
next(reader)
base_values = set()
for ID,value in reader:
base_values.add((ID,value))
for f in [f2,f3]:
reader = csv.reader(f)
next(reader)
for row in reader:
thing = tuple(row)
if thing in base_values:
base_values.remove(thing)
missing2 = io.StringIO()
writer = csv.writer(missing2)
writer.writerow(['Id','Value'])
writer.writerows(base_values)