如何在python中正确比较两个不同的大型excel文件中的行和列?

时间:2019-06-02 12:32:28

标签: python excel python-3.x openpyxl

美好的一天。有多个大型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工具来做到这一点?

1 个答案:

答案 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)