скрипт Python для сравнения 2 файлов и поиска различий - PullRequest
0 голосов
/ 10 апреля 2019

У меня 2 отчета в формате pdf, и еще один отчет в формате csv. Я хотел бы получить код Python, который определяет разницу между файлами, поскольку во всех файлах есть только таблицы (номер заказа, дата, цена, имя и фамилия) вместо того, чтобы смотреть на каждый заказ и сравнивать цены. Есть некоторые заказы, которые не являются отображение в листе Excel или общая сумма покупки не совпадают для одного и того же клиента.

Я провел кое-какие исследования и нашел код, который создает таблицу Excel со всеми данными и меняет цвет в зависимости от типа ошибки (добавлено, пропущено и общее не равно друг другу)

import pandas as pd
from pathlib import Path
#using the panda library helps instead of csv formatting both files

def excel_diff(path_OLD, path_NEW, index_col):

df_OLD = pd.read_excel(path_OLD, index_col=index_col).fillna(0)
df_NEW = pd.read_excel(path_NEW, index_col=index_col).fillna(0)

# Perform Diff to find differences between both files
dfDiff = df_NEW.copy()
droppedRows = []
newRows = []

cols_OLD = df_OLD.columns
cols_NEW = df_NEW.columns
sharedCols = list(set(cols_OLD).intersection(cols_NEW))

for row in dfDiff.index:
    if (row in df_OLD.index) and (row in df_NEW.index):
        for col in sharedCols:
            value_OLD = df_OLD.loc[row,col]
            value_NEW = df_NEW.loc[row,col]
            if value_OLD==value_NEW:
                dfDiff.loc[row,col] = df_NEW.loc[row,col]
            else:
                dfDiff.loc[row,col] = ('{}→{}').format(value_OLD,value_NEW)
    else:
        newRows.append(row)

for row in df_OLD.index:
    if row not in df_NEW.index:
        droppedRows.append(row)
        dfDiff = dfDiff.append(df_OLD.loc[row,:])

dfDiff = dfDiff.sort_index().fillna('')
print(dfDiff)
print('\nNew Rows:     {}'.format(newRows))
print('Dropped Rows: {}'.format(droppedRows))

# Save output and format
fname = '{} vs {}.xlsx'.format(path_OLD.stem,path_NEW.stem)
writer = pd.ExcelWriter(fname, engine='xlsxwriter')

dfDiff.to_excel(writer, sheet_name='DIFF', index=True)
df_NEW.to_excel(writer, sheet_name=path_NEW.stem, index=True)
df_OLD.to_excel(writer, sheet_name=path_OLD.stem, index=True)

# get xlsxwriter objects
workbook  = writer.book
worksheet = writer.sheets['DIFF']
worksheet.hide_gridlines(2)
worksheet.set_default_row(15)

# define formats
date_fmt = workbook.add_format({'align': 'center', 'num_format': 'yyyy-mm-dd'})
center_fmt = workbook.add_format({'align': 'center'})
number_fmt = workbook.add_format({'align': 'center', 'num_format': '#,##0.00'})
cur_fmt = workbook.add_format({'align': 'center', 'num_format': '$#,##0.00'})
perc_fmt = workbook.add_format({'align': 'center', 'num_format': '0%'})
grey_fmt = workbook.add_format({'font_color': '#E0E0E0'})
highlight_fmt = workbook.add_format({'font_color': '#FF0000', 'bg_color':'#B1B3B3'})
new_fmt = workbook.add_format({'font_color': '#32CD32','bold':True})

# set format over range
## highlight changed cells
worksheet.conditional_format('A1:ZZ1000', {'type': 'text',
                                        'criteria': 'containing',
                                        'value':'→',
                                        'format': highlight_fmt})

# highlight new/changed rows
for row in range(dfDiff.shape[0]):
    if row+1 in newRows:
        worksheet.set_row(row+1, 15, new_fmt)
    if row+1 in droppedRows:
        worksheet.set_row(row+1, 15, grey_fmt)

# save
writer.save()
print('\nDone.\n')


  def main():
path_OLD = Path('v1.xlsx')
path_NEW = Path('v2.xlsx')

# get index col from data
df = pd.read_excel(path_NEW)
index_col = df.columns[0]
print('\nIndex column: {}\n'.format(index_col))

excel_diff(path_OLD, path_NEW, index_col)


 if __name__ == '__main__':
main()
# will highlight changes in red, new rows in green, and dropped rows in grey. 

Как видите, этот код работает только для файлов xlsx, а не pdf. есть ли способ обойти это? Желаемым результатом будет лист Excel, созданный со всеми данными в нем, и требуемые основные моменты, показывающие разницу между старыми и новыми данными. Спасибо всем заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...