2014-11-08 5 views
3

900000 행을 포함하는 매우 큰 텍스트 파일이 있습니다. 줄에 'year1995'와 'year1996'이없는 줄을 계산해야합니다. 나는 다음과 같이했다 :특정 문자열을 포함하지 않는 목록 요소의 수를 계산하십시오.

fname = r"data.txt" 
with open(fname,'r') as fi: 
    lines = fi.read().splitlines() 
    print len(lines) 
    test = [l for l in lines if 'year1995' or 'year1996' not in l] 
    print len(test) 

그러나 내 코드가 예상 결과를 내지 않는다.

아이디어가 있으십니까?

+0

"egrep -v"year1995 | year1996 "data.txt"를 사용하는 이유는 무엇입니까? 그리고 카운트하려면 그냥 끝에 "| wc -l"을 추가하십시오 –

답변

1

코드는 모든 단일 라인을 test에 넣습니다. 비어 있지 않은 문자열이 사실이기 때문에 첫 번째 if 문은 항상 True으로 계산되기 때문입니다.

[l for l in lines if not ('year1995' in l or 'year1996' in l)] 
0

당신은 당신의 if 조건을 변경해야

if not 'year1995' in l or not 'year1996' in l 

또는

if not ('year1995' in l or 'year1996' in l) 

참고 : 당신이 not 작업 후 조건을 둘 필요가!

1

그것은 목록을 작성 무의미 그냥 합계 사용, 그것을 멀리 던져 : 이해력 내에서 테스트를 변경

with open(fname,'r') as fi: 
     print sum(not any(x in line for x in ('year1995','year1996')) for line in fi) 

lines = fi.read().splitlines()도 필요하지 않습니다를 바로하는 것이다 파일 객체를 반복 각 줄을.

+0

사실, 좋네요! 아마도 더 많은 메모리를 효율적으로 사용할 수 있습니다. –

+0

@Apero, 더 효율적으로 말하자면 OP에 목록이 필요하지 않으면 두 개의 목록을 만드는 것이 무의미합니다. –

+0

하지만 내 의견에 언급 된 것처럼 여전히 파이썬을 사용하지 않을 것입니다. 질문 자체. OP가이 섹션 뒤에있는 코드에서 필터링 된 라인을 처리하고 싶지 않으면. –

관련 문제