2012-09-13 6 views
0

Python 초보자, 저는 파일을 읽고 기본적인 작업을 수행하는 것에 익숙해졌습니다. 그러나 이제는 다른 파일을 기반으로 하나의 파일을 필터링하려고합니다. file2의 3 열에서 100000 미만의 점수를 가진 행을 제거하려면 file1을 필터링하고 싶습니다. 나는 주 데이터 파일 (파일 1)가 :하나의 파일을 다른 파일의 값을 기준으로 필터링하십시오.

7 303 0.207756232686981 
16 23 0.208562019758507 
6 57 0.208727272727273 
7 80 0.209065354884048 
11 124 0.209500609013398 

을하고 나는이 하나의 동일한 새 데이터 파일을 만들고 싶어하지만 두 번째 파일의 정보를 기반으로보다 100000의 점수를 가지고있는 라인을 제거 (파일 2) 모두 파일

chr7 303 292526 
chr16 23 169805 
chr6 57 62822 
chr11 124 320564 
chr7 80 300291 

처음 두 칼럼 라인이 두 파일 모두 동일한 경우이다 여부를 결정하는 정보를 포함한다. 그러나 두 번째 파일에는 각 숫자 앞에 'chr'이 추가됩니다 (이 'chr'은 무시할 수 있음). 첫 번째 파일의 모든 줄은 두 번째 파일에 있지만 두 번째 파일에는 무시할 수있는 줄이 있습니다. 그 아래의 첫 번째에있는 다른 모든 라인 동안 100,000 파일 2의 3 열에서 값을 가지고 있기 때문에

6 57 0.208727272727273 

이 새로운 출력에서 ​​제거 될 것이다 :

그래서 라인 위의 예에서 찾고 파일은 귀하의 값이 100000 이상으로 포함될 것입니다. 파일 1과 동일한 행 순서를 유지하는 출력 파일에 대해서도 중요합니다.

어떤 도움을 주시면 감사하겠습니다. 나는 일반적으로 이렇게이 구조를 구축 답변 추가 좋을 것

for line in inputfile: 
     line = line.rstrip() 
     fields = line.split("\t") 

의 파이썬 구조를 사용합니다.

질문이 명확하지 않은 경우 알려주십시오. 지금까지

솔루션 :

#!/usr/bin/env python 



f2 = open('/mnt/genotyping/CT/GreatApes/HKA/callability/callable_sites_per_region_500Kb.txt', 'r') 
d2 = {} 
print f2 
for line in f2: 
    line = line.rstrip() 
    fields = line.split("\t") 
    key = (fields[0].replace('chr', ''), fields[1]) 
    d2[key] = int(fields[2]) 





f1 = open('/mnt/genotyping/CT/GreatApes/HKA/Barcelona_approach/500kb/cov_5/Homo-Gorilla/R_plots/Gorilla_genome_dist_cov5.txt', 'r') 
for line in f1: 
    line = line.rstrip() 
    fields = line.split("\t") 
    if 'region' not in line: 
     key = (fields[0], fields[1]) 
     if d2[key] >= 100000: 
      print line 

감사

+0

질문은 무엇입니까 1 일, 파일 2의 키가있는 딕셔너리를 생성? http://whathaveyoutried.com? –

+0

나는 첫 번째 파라를 편집하여 질문을 직접 포함 시켰습니다. 두 파일을 동시에 읽는 방법에 익숙하지 않았습니다. – user964689

+0

짧은 대답은 SQL 데이터베이스가 필요합니다. 포함 된 ['sqlite3' 모듈] (http://docs.python.org/library/sqlite3.html)을 살펴보십시오. SQL 데이터베이스 (심지어 sqlite와 같은 임베디드)는이 작업을 짧게 처리합니다. 이러한 파일을 작업 할 * 수 *있는 경우 다음 형식은 파일 형식을 형식화하기위한 ['csv' 모듈] (http://docs.python.org/library/csv.html)이어야합니다. –

답변

2

내가 대신 파일의 문자열을 사용하지만 원칙은 동일하게 유지됩니다.

>>> f2 = """chr7\t303\t292526 
chr16\t23\t169805 
chr6\t57\t62822 
chr11\t124\t320564 
chr7\t80\t300291""" 
>>> d2 = {} 
>>> for line in f2.split('\n'): 
    line = line.rstrip() 
    fields = line.split("\t") 
    key = (fields[0].replace('chr', ''), fields[1]) 
    d2[key] = int(fields[2]) 


>>> d2 
{('7', '303'): 292526, ('7', '80'): 300291, ('16', '23'): 169805, ('6', '57'): 62822, ('11', '124'): 320564} 

d2에서 파일 1 개 체크 값의 라인을 인쇄 :

>>> f1 = """7\t303\t0.207756232686981 
16\t23\t0.208562019758507 
6\t57\t0.208727272727273 
7\t80\t0.209065354884048 
11\t124\t0.209500609013398""" 
>>> for line in f1.split('\n'): 
    line = line.rstrip() 
    fields = line.split("\t") 
    key = (fields[0], fields[1]) 
    if d2[key] >= 100000: 
     print line 


7 303 0.207756232686981 
16 23 0.208562019758507 
7 80 0.209065354884048 
11 124 0.209500609013398 
>>> 
+0

file2가 너무 크지 않다면이 해결책은 좋습니다. 이 대답은 file1 데이터를 필터링하는 인 메모리 인덱스를 생성하므로 큰 파일은 잠재적으로 해당 인덱스를 저장하는 데 많은 메모리를 사용할 수 있습니다. –

관련 문제