두 개의 CSV 파일을 비교하고 Python을 사용하여 차이점 인쇄
- 방법 1: 가장 파이썬적인 솔루션을 사용하여 두 개의 CSV 파일 비교
-
방법 2:
csv-diff
- 외부 모듈을 사용하여 두 개의 CSV 파일 비교 - 방법 3: Pandas DataFrames를 사용하여 두 개의 CSV 파일 비교
이 기사에서는 두 CSV 파일을 비교하는 다양한 방법에 대해 설명합니다. 우리는 이 작업을 수행하는 가장 “Pythonic” 방법과 이 작업을 단순화하는 데 도움이 될 수 있는 외부 Python 모듈을 포함할 것입니다.
마지막으로 Pandas DataFrames를 사용하여 CSV 파일의 차이점을 식별하는 방법을 포함합니다.
비교해야 하는 두 CSV 파일의 제목이 file1.csv
및 file2.csv
라고 가정합니다. 적절하다고 생각되는 파일의 이름을 바꿀 수 있습니다.
또한 아래 제공된 코드 스니펫에서 파일 이름을 적절하게 바꾸십시오.
예를 들어 다음과 같이 파일을 설정했습니다.
파일1.csv
:
1,2,3,4,5,6
4,5,6,7,8,9
1,3,4,5,6,1
file2.csv
:
1,2,3,4,5,6
4,5,6,7,8,9
2,3,1,4,1,5
방법 1: 가장 파이썬적인 솔루션을 사용하여 두 개의 CSV 파일 비교
이 방법에서는 파일의 내용을 두 개의 목록으로 읽고 목록 중 하나를 반복하고 각 줄이 두 번째 목록에 있는지 여부를 확인합니다. 논리적으로 이것은 매우 간단한 해결책입니다.
파이썬의 근본적인 효율성은 어떻게 생겼는지에도 불구하고 이 비교를 상당히 효율적으로 만듭니다.
with open("file1.csv", "r") as file1, open("file2.csv", "r") as file2:
f1_contents = file1.readlines()
f2_contents = file2.readlines()
for line in f1_contents:
if line not in f2_contents:
print(line)
for line in f2_contents:
if line not in f1_contents:
print(line)
위의 코드 조각은 터미널에 다른 줄을 인쇄합니다.
테스트 사례에서는 다음을 출력으로 얻습니다.
1,3,4,5,6,1
2,3,1,4,1,5
방법 2: csv-diff
- 외부 모듈을 사용하여 두 개의 CSV 파일 비교
먼저 터미널에서 다음 명령을 사용하여 모듈을 설치합니다.
python3 -m pip install csv-diff
일단 설치되면 Python 스크립트를 작성할 필요가 없습니다. 다음 명령을 사용하여 터미널에서 직접 실행할 수 있습니다.
csv-diff file1.csv file2.csv --key=id
이 명령을 실행하면 터미널에 차이점이 표시됩니다.
테스트 사례에서는 다음을 출력으로 얻습니다.
1 row added, 1 row removed
1 row added
1: 2
2: 3
3: 1
4: 4
5: 1
6: 5
1 row removed
1: 1
2: 3
3: 4
4: 5
5: 6
6: 1
이 모듈을 Python 스크립트의 일부로 사용하려면 다음과 유사한 스크립트를 작성할 수 있습니다.
from csv_diff import load_csv, compare
difference = compare(load_csv(open("file1.csv")), load_csv(open("file2.csv")))
print(difference)
이에 대한 출력은 다음과 같습니다.
{'added': [{'1': '2', '2': '3', '3': '1', '4': '4', '5': '1', '6': '5'}], 'removed': [{'1': '1', '2': '3', '3': '4', '4': '5', '5': '6', '6': '1'}], 'changed': [], 'columns_added': [], 'columns_removed': []}
방법 3: Pandas DataFrames를 사용하여 두 개의 CSV 파일 비교
다음 스크립트는 이 작업을 수행할 수 있습니다.
import pandas as pd
import sys
import csv
def dataframe_difference(df1: pd.DataFrame, df2: pd.DataFrame, which=None):
comparison_df = df1.merge(df2, indicator=True, how="outer")
if which is None:
diff_df = comparison_df[comparison_df["_merge"] != "both"]
else:
diff_df = comparison_df[comparison_df["_merge"] == which]
return diff_df
if __name__ == "__main__":
df1 = pd.read_csv("file1.csv", header=None)
df2 = pd.read_csv("file2.csv", header=None)
print(dataframe_difference(df1, df2))
테스트 파일에 헤더가 없기 때문에 read_csv
메서드에서 header=None
인수가 입력된다는 점에 유의하십시오. 파일에 헤더가 있는 경우 pd.read_csv("file1.csv")
를 사용하여 읽을 수 있습니다. 여기서 file1.csv
는 대신 파일로 대체됩니다.
파일이 스크립트와 동일한 디렉토리에 없는 경우 CSV 파일의 전체 경로를 제공하십시오.
위의 Python 스크립트는 다음과 같은 출력을 생성해야 합니다.
0 1 2 3 4 5 _merge
2 1 3 4 5 6 1 left_only
3 2 3 1 4 1 5 right_only
left_only
및 right_only
옆 줄에는 모든 차이점이 포함되어 있습니다. _merge
옆의 줄은 인덱스만 나타냅니다.