2014-04-09 6 views
0

안녕하세요 두 CSV 파일을 비교하는 데 도움이 필요합니다 ... 두 파일의 일치하는 레코드를 출력 파일로 가져오고 다른 출력 파일에 일치하지 않는 레코드를 가져 오십시오 ... 예 : 첫째 csv 파일 이름 및파이썬을 사용하여 CSV 파일을 비교하십시오

등의 데이터와 급여

A 20000 
B 15000 
C 10000 
D 5000 

2 CSV 파일로 데이터를 두 개의 열 이름과 급여를 포함 포함

A 40000 
D 10000 
B 15000 

내 출력이 일치하는 파일이 포함 된 B 15000 B 두 개의 파일로 와야한다 파일 1과 파일 2 각각 15000 개 , 2 파일

A 20000,A 40000 
C 10000,-------(no record in file2) 
D 5000, D 10000 
로 타의 추종을 불허하는 기록을 포함
+2

https://docs.python.org/2/library/csv.html 및 https://docs.python.org/2/library/functions.html#map 사용 방법보기 너 자신을 지치고 싶다. 나는 올바른 방향으로 당신을 가리키고있다. 나는이 질문을 광범위하게 다루기 때문에 투표를하고있다. 그리고 적어도 당신 스스로 문제를 해결하려고 노력해야한다. – Torxed

+0

예를 들어 'A': 20000'과 같은 키를 사용하여 dict에 값을 입력 한 다음 두 번째 파일의 값을 비교하고 그 값이 dict 값보다 큰 경우 새 값으로 바꾸십시오. – Pythonizer

+0

이 스크립트를 사용해 보았습니다 오기 CSV FILE1 = 개방 ("1.csv", "R") reader1 = csv.reader (FILE1) reader1.next() 파일 2 = 개방 ("2.csv", "R") reader2 = csv.reader (파일 2) reader2.next() FILE3 = 개방 ("file3.txt", "w") file4 = 개방 ("file4.txt", "w"),515, file1.seek (0,0) 리스트 1에 대한 I file2.seek (0,0) 목록 1 = file1.readlines() file2.readlines리스트 2 =() : J에 대한 리스트 2 : 경우 나 == J : file3.write (I) file3.write (j) 다른 : file4.write (I) file4.write (j) 하지만 ITZ 복용 헤더 또한 플러스 비교할 수없는 파일 비교가 모두 수행되었습니다 – user3514648

답변

0
f1_in = open("f1.csv","r") 
f1_dict = {} 
for line in f1_in: 
    l = line.split() 
    f1_dict[l[0].strip()] = l[1].strip() 
f1_in.close() 

f2_in = open("f2.csv","r") 
f2_dict = {} 
for line in f2_in: 
    l = line.split() 
    f2_dict[l[0].strip()] = l[1].strip() 
f2_in.close() 

f_same = open("same.txt","w") 
f_different = open("different.txt","w") 

for k1 in f1_dict.keys(): 
    if k1 in f2_dict.keys() \ 
    and f2_dict[k1] == f1_dict[k1]: 
     f_same.write("{0}, {1}\n".format(str(k1)+" "+str(f1_dict[k1]), 
             str(k1)+" "+str(f2_dict[k1]))) 
    elif not k1 in f2_dict.keys(): 
     f_different.write("{0}, {1}\n".format(str(k1)+" "+str(f1_dict[k1]), 
               "------")) 
    elif not f2_dict[k1] == f1_dict[k1]: 
     f_different.write("{0}, {1}\n".format(str(k1)+" "+str(f1_dict[k1]), 
               str(k1)+" "+str(f2_dict[k1]))) 

f_same.close() 
f_different.close() 

편집 : 가 키를 반복하기 전에, (for k1 in f1_dict.keys()를) 키에 의해 딕셔너리를 정렬하려면 :

# get the keys as a list 
my_keys = f1_dict.keys() 
# sort it 
my_keys.sort() 
# use sorted list 
for k1 in my_keys: 

이하여 딕셔너리를 정렬하려면 키를 반복하기 전에 값 :

# return a list of tuple : [(key1,value1),(key2,value2)] 
my_zip = zip(f1_dict.keys(), f1_dict.values()) 
# now you have a list you can sort it : 
my_sorted_list = sorted(my_zip, key=lambda value, value[2]) 

key=lambda value, value[2]my_zip은 목록의 각 튜플의 두 번째 값을 사용하여 정렬됩니다.

# use sorted list 
for t in my_sorted_list: 
    # t is a tuple 
    k1 = t[0] 
    value = t[1] 
+0

감사합니다. cft 나는 이것을 시도하고 오류가 발생했을 때 접근합니다 ... – user3514648

+0

f1_dict [l [0] .strip()의 'list index out of range')] = l [1]이다.strip() – user3514648

+0

얼마나 많은 열을 가져갈 수 있도록 스크립트를 수정하는 방법 ... 지금은 2 컬럼 비교 만하는 itz ... 그리고 또한 내 출력 파일 데이터를 정렬해야합니다. – user3514648

관련 문제