2017-11-10 6 views
1

같은 행에 대해 7 개의 다른 파일을 비교하고 여러 파일에있는 항목을 표시하려고합니다. 이미 이런 일이탭으로 구분 된 파일 7 개를 비교하여 유사점 인쇄

file1 and file2 and file3: ID123 
file2 and file3: ID999, ID123 

:

with open('some_file_1.txt', 'r') as file1: 
    with open('some_file_2.txt', 'r') as file2: 
     same = set(file1).intersection(file2) 

same.discard('\n') 

with open('some_output_file.txt', 'w') as file_out: 
    for line in same: 
     file_out.write(line) 

을하지만,이 경우 내가 7을 비교하려면 예를 들어

file1: 
ID123 columns with info 
ID456 columns with info 
ID789 columns with info 

file 2: 
ID123 columns with info 
ID999 columns with info 
ID888 columns with info 

file3: 
ID999 columns with info 
ID123 columns with info 
ID555 columns with info 

는 내가 좋아하는 유사한/쇼 뭔가를 인쇄 할 파일. 또한 탭으로 구분 된 파일이므로 각 파일의 첫 번째 열을 서로 비교하고 중복 된 내용을 기록하고 싶습니다. 나는 내가 필요하다고 생각한다.

for i in excelList[1:]:      
    newlist = newlist.append(i.split("\t")[0]) 

또는 그런 무엇인가. 7 개의 목록을 만들더라도 ".intersection"코드로 서로 비교할 수는 없습니다.

더 쉬운 방법이 있나요?

+1

대부분 관련이 없지만 대신 stdlib의 csv 모듈을 사용하는 것이 좋습니다. csv를 구문 분석하는 것은 seprator에서 분할하는 것보다 훨씬 까다로운 작업 일 수 있습니다. –

답변

1

당신은 파일 이름의 목록에 dict 매핑 ID를 사용할 수 있습니다

from collections import defaultdict 

id_to_files = defaultdict(list) 

for filename in filenames: 
    with open(filename, "rb") as f: 
     reader = csv.reader(f, delim="\t", ...) 
     for row in reader: 
      id = row[0] 
      id_to_files[id].append(filename) 

그래서 당신은 같은 것을 얻을 것이다 : 당신이 다음 하나의 파일로 항목을 제거 필터링 할 수 있습니다

print(id_to_files) 

{ 
    "ID123": ["file1", "file2", "file3"], 
    "ID999": ["file2", "file3"], 
    "ID888": ["file2"], 
    "ID555": ["file3"], 
    "ID456": ["file1"], 
    "ID789": ["file1"], 
} 

을 (중복되지 않았기 때문에) 나열되어 있습니다.

duplicates = {k:v for k, v in id_to_files.iteritems() if len(v) > 1} 
print(duplicates) 

{ 
    "ID123": ["file1", "file2", "file3"], 
    "ID999": ["file2", "file3"], 
} 

그런 다음 원하는 정확한 출력은 결국 예를 들어 ... 역 매핑 출력 형식을 가장 적합한 무엇 이건 두 번째지도를 구축 할 수 있습니다 : 당신은 당신이 설명하는 정확한 출력을 위해 몇 단계를 추가해야합니다

revduplicates = defaultdict(list) 
for k, v in duplicates.iteritems(): 
    revduplicates[tuple(v)].append(k) 
print(revduplicates) 

{ 
    ('file1', 'file2', 'file3'): ['ID123'], 
    ('file2', 'file3'): ['ID999'], 
} 

을하지만은해야 적어도 당신을 시작하게하십시오.

+0

이 경우 목록은 모든 파일 경로/names.txt의 목록입니까? 그러면 모든 파일을 서로 비교하고 모든 중복 ID를 새 파일에 저장합니까? – Fini

+0

@Fini cf 내 업데이트 답변. –

+0

감사합니다, 이것은 내가 무엇을 찾고 있었는지, 나는 이것을 시도 할 것이다 :) – Fini