Как сравнить два текстовых файла в пределах Pandas Python и выделить их в другом Excel или текстовом файле - PullRequest
0 голосов
/ 03 марта 2020

Итак, я рассмотрел несколько способов, как сравнить два файла gfile. Один из способов сравнения двух файлов, который я искал и обнаружил, заключался в использовании модуля Pandas. Другим способом, который я обнаружил, было использование модуля Numpy в Python, я также использую различные другие модули, чтобы помочь мне работать с листами Excel. Главное, у меня есть текстовый файл ACII, который мне нужно сравнить с другим файлом. Оба файла имеют одинаковый размер, и я даже включил проверку, чтобы увидеть, имеют ли файлы одинаковый размер, но я думаю, что что-то не так с условными утверждениями, которые проверяют общий размер двух файлов. В общем, мне нужен совет, как сравнить два файла.

В текстовом файле используется кодировка UTF 8. Информация будет выглядеть следующим образом:

StudentID,Code,Date,FirstName,LastName,GradeLevel,CampusID
000001,R,mm/dd/yyyy/,JOHN,SMITH,01,00001

Заголовок не отображается в исходном файле, который я должен сравнивать. Заголовок оригинального файла:

StudentID,Code,Date,FirstName,LastName,GradeLevel,CampusID

Файл, который я извлекаю из нашей базы данных SIS, имеет заголовки, которые соответствуют

StudentID,Code,Date,FirstName,LastName,GradeLevel,CampusID

Но некоторые форматирования немного отличаются. Например, данные не mm/dd/yyyy, а CampusID - только ### Документация, на которую я обращался, чтобы помочь мне, показала следующее:

Теперь я смог распечатать данные в объединенном фрейме данных, но я пока не смог провести сравнения и выделить различия между двумя файлы, будь то текстовые или файлы Excel. Мне было любопытно, если кто-нибудь может указать мне направление или лучшее направление, если они знают, как сравнивать файлы. Я сейчас использую следующий код, и он, по крайней мере, печатает фреймы данных, но, похоже, ничего не делает, кроме как печатать их как pandas фрейм данных.

#!/bin/python 
# ===========================================================
# Created By: Richard Barrett
# Organization: DVISD
# DepartmenT: Data Services
# Purpose: Dynamic Excel Diff Comparison Report
# Date: 02/28/2020
# ===========================================================

import getpass
import json
import logging
import numpy as np 
import os 
import pandas as pd
import platform  
import shutil 
import subprocess
import threading
import time
import unittest
import xlsxwriter
from datetime import date

# System Variables
today = date.today()
date = today.strftime("%m/%d/%Y")
node = platform.node()
system = platform.system()
username = getpass.getuser()
version = platform.version()
working_directory = os.getcwd()
pd.set_option('display.max_rows', None)

# File Variables on Relative Path within CWD
file_1 = "ExportPOSStudents.xlsx"
file_2 = "ExportNutrikidsSkywardCompare.xlsx"

# Column Variables to Compare
e_code = "Eligibility Code"
e_date = "Effective Date"
f_name = "First Name"
l_name = "Last Name"

# Logging Variables 

# Ensure that the Files Exist
if os.path.exists(file_1) and os.path.exists(file_2):
    print("The Files Exist.")
else:
    print("One of the files might not exist.")

# Create Dataframes
df1 = pd.read_excel(file_1)
df2 = pd.read_excel(file_2)

print(df1)
print(df2)

# Check to See if Files are Same Size
df1.equals(df2)
if print(df1.equals(df2)) is False:
    print("Dataframes are not the same size.")
else:
    print("Dataframes are the same size.")

df1[e_date].equals(df2[e_date])
if print(df1[e_date].equals(df2[e_date])) is False:
    print("The Entries are not the same within column for e_date.")
else:
    print("The Entries are the same within the columns for e_date.")

#comparison_values = df1.values == df2.values
#print(comparison_values)
#if df2.equals(df1) == False:
#    print("Datframes are not of the the same size.")
#else df2.equals(df1) == True: 
#    print("Dataframes are of the same size.")

# If Files are Not Same Size Check Indexes and Column Names and Format

# Check Indexes and Size 

# Compare Dataframe Values
#if comparison_values = df1.values == df2.values
#    print(comparison_values)
#else:
#    print("Cannot compare Dataframes.")

# Get-Index of Cell with Parameter == False
#rows,cols=np.where(comparison_values==False)

# Iterate over Cells and Update (df1) value to display changed value in second dataframe (df2)
#for item in zip(rows,cols):
#    df1.iloc[item[0], item[1]] = '{} --> {}'.format(df1.iloc[item[0], item[1]],df2.i

# Export to Excel after df1(Old Value) --> df2(New Value)
#df1.to_excel('./excel_diff.xlsx',index=False,header=True)

Здесь вы можете увидеть основной код и процесс, которого я пытаюсь достичь: Ссылка на код и процесс

1 Ответ

0 голосов
/ 03 апреля 2020

Мне удалось сравнить два листа Excel, используя следующее: После этого у вас будет новая электронная таблица с тремя рабочими книгами.

import pandas as pd
from pathlib import Path


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
    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()

Вам придется работать с выделением в книге, поскольку у меня все еще есть проблема с ним. ЗАМЕТЬТЕ, ЧТО ЭТОТ ОТВЕТ РАБОТАЕТ ТОЛЬКО С РАСПИСАНИЯМИ EXCEL

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