2014-04-30 1 views
0

두 개의 서로 다른 파일에서 [1] 행에 일반적인 교차 ID를 찾으려는 코드를 작성했습니다. 내 작은 샘플 파일을 확인 작동하지만 내 큰 파일을 않습니다. 왜 그런지 모르겠다. 뭐가 잘못 됐는지 제안 해 줄 수 있니? 정확한 문제는 입력 값이 200 일 때입니다. 즉, 교차로를 90 개 부여합니다. 150으로 축소하면 교차로가 110이되고 논리적으로는 더 높을 수 없습니다.두 사전에서 공통 ID (교차) 찾기

내 파일 1이 선으로 정렬됩니다
fileA = open("file1.txt",'r') 
fileB = open("file2.txt",'r') 
output = open("result.txt",'w') 
#fileA.next() 

dictA = dict() 
for line1 in fileA: 
    listA = line1.split('\t') 
    dictA[listA[1]] = listA 

dictB = dict() 
for line1 in fileB: 
    listB = line1.split('\t') 
    dictB[listB[1]] = listB 

for key in set(dictA).intersection(dictB): 
    output.write(dictB[key][0]+'\t'+dictA[key][1]+'\t'+dictA[key][4]+'\t'+dictA[key][5]+'\t'+dictA[key][9]+'\t'+dictA[key][10]+'\n') 

[0] 0-15 선이, 난 단지 라인을 넣어 예를 들어 줄 여기 간단하게하기 [0] 라인 [1],

contig17 GRMZM2G052619_P03 x x x x x x x x x x x x x x 
contig33 AT2G41790.1 x x x x x x x x x x x x x x 
contig98 GRMZM5G888620_P01 x x x x x x x x x x x x x x 
contig102 GRMZM5G886789_P02 x x x x x x x x x x x x x x 
contig123 AT3G57470.1 x x x x x x x x x x x x x x 

내 파일 2 정렬 0-10 선이 아니고, I는, [1]

y GRMZM2G052619_P03 y y y y y y y y   
y GRMZM5G888620_P01 y y y y y y y y  
y GRMZM5G886789_P02 y y y y y y y y  

내 원하는 출력 라인만을 제공

contig17 GRMZM2G052619_P03 y y y y 
contig98 GRMZM5G888620_P01 y y y y 
contig102 GRMZM5G886789_P02 y y y y 
+0

키가 실제로 일치하고 실제로 '\ t'로 구분되어 있습니까?누락 된 공백이나 다른 공백이있어 "동일한"키가 일치하지 않을 수 있습니다. – beerbajay

+0

내 파일 2 일부 누락 된 데이터가 있지만 어쨌든 탭으로 구분됩니다. 어떻게 개선할까요? – user3224522

+0

'.split ('\ t')'을'.split()'으로 변경할 수 있습니다. 모든 공백과 탭을 나눕니다. – MostafaR

답변

1

에주의가 :

output.write(dictB[key][0]+'\t'+dictA[key][1] 

그것은 당신이 FILE1 두 번째 열보다 첫 번째 열을 file2 인쇄 의미한다. 그것은 당신의 예제와 원하는 출력과 일치하지 않습니다.

교차로 루틴에 관해서는 꽤 정확한 것처럼 보입니다. 아마도 파일에 문제가있는 것 같습니다. 모든 키가 고유 한가요? "150 줄이기"란 무엇을 의미합니까? 바로이 파일에서 일부 줄만 지우는 것입니까?

또한 더 나은

for key in dictA: 
    if key in dictB: 

그것은 실제로 동일합니다 함께

for key in set(dictA).intersection(dictB): 

교체되어야하지만 빠르고 적은 메모리를 보낸다.

+0

감사합니다. 제거했습니다. 동일한 파일의 일부 줄은 너무 작아서 출력에 덜 고유 한 컨티그가있을 것으로 기대합니다. 대신에 더 많은 것을 가지고 있습니다. 이것은 매우 이상합니다. 왜 도착하지 않을까요? ((열쇠에 관해서는, 그들은 유일하지 않다, 나는 분리 된 부호를 사용하여 유일한 contigs를 센다 – user3224522

1

문제를 줄이고 테스트를 해보십시오. 테스트 프레임 워크 사용에 대해서는 자세히 설명하지 않고 assert을 사용하는 방법을 보여줍니다.

assert에는 두 개의 매개 변수가 있습니다. 첫 번째는 true로 예상되는 식입니다. 두 번째 것은 선택 사항이며 실제로 적용될 것으로 예상되는 것에 대해 긍정적으로 표현 된 가정을 포함해야합니다. 여기

다음 테스트를 예를 수정 : 당신보다 당신의 파일을 재생하고 작업을하고 무엇을하지 않는 무엇을 좁힐 것이다

fileA_txt = """contig17 GRMZM2G052619_P03 x x x x x x x x x x x x x x 
contig33 AT2G41790.1 x x x x x x x x x x x x x x 
contig98 GRMZM5G888620_P01 x x x x x x x x x x x x x x 
contig102 GRMZM5G886789_P02 x x x x x x x x x x x x x x 
contig123 AT3G57470.1 x x x x x x x x x x x x x x 
""" 
# or read it from file 
#with open("filaA.txt") as f: 
# fileA_txt = f.read() 
fileB_txt = """y GRMZM2G052619_P03 y y y y y y y y   
y GRMZM5G888620_P01 y y y y y y y y  
y GRMZM5G886789_P02 y y y y y y y y  
""" 
# or read it from file 
#with open("filaB.txt") as f: 
# fileB_txt = f.read() 

dictA = dict() 
for line1 in fileA_txt.splitlines(): 
    listA = line1.split() 
    dictA[listA[1]] = listA 
assert len(dictA) == 5, "fileA_txt shall contain 5 unique IDs" 

dictB = dict() 
for line1 in fileB_txt.splitlines(): 
    listB = line1.split() 
    dictB[listB[1]] = listB 
assert len(dictB) == 3, "fileA_txt shall contain 3 unique IDs" 

common_IDs = set(dictA).intersection(dictB) 
assert len(common_IDs) == 3, "there shall be just 3 common keys" 

.

이전에 놀랐던 fileA_txt (또는 대안을 파일에서 읽음)를 다른 파일로 바꾸기 만하면됩니다. 당신은 당신이 기대할 수 있습니다 가정을 찾을 경우

, 더 많은 주장 추가

는 스크립트를 실행하십시오 (파일은 라인과 고유 ID, 테스트 항상 같은 수의 경우처럼, 코드는 수정되어야 할 것이다) assert 예외가 나타날 때까지 이것에

+0

미안하지만, 나는 아무것도 이해하지 못했습니다 ... 또한, ID는 내가 가지고 있어야합니다 – user3224522

+0

@ user32234522 내 메시지를 짧게하려면 : assert를 코드에 넣으십시오. 그러면 어떤 기대가 실제로 이루어지고 다른 데이터 파일로 계속 놀 수 있습니다. 그 'assert' 문은 자동으로 예외를 던지고 당신을 그 장소로 향하게 할 것입니다. 이는 테스트 중심 개발의 기본입니다. 테스트를 더 간단하게하기 위해 문제에 관련되지 않은 코드를 의도적으로 제거했습니다. 출력에 쓰는 것과 같은 문제는 파일에 쓰는 것이 아니라 고유 한 ID의 개수에 있습니다. –