2016-09-02 3 views
2

이의 나는 다음과 같은 내용의 파일이 있다고 가정 해 봅시다 (매도 라인이 비어) :
파이썬 - 텍스트 파일에 빈 줄을 계산

1 호선

라인 2

3 호선

.

count = 0 
for line in open("myfile.txt"): 
    if line == '':     #or if len(line) == 0 
    count += 1 
..

나는 2 가지 방법으로 파일을 읽으려고


count = 0 
file = open('myfile.txt') 
lines = file.readlines() 
for line in lines: 
    if line == '':     #or if len(line) == 0 
    count += 1 

그러나 count는 항상 0을 유지 어떻게 공 i 행의 수를 셀 수?

+8

빈 줄에는 여전히 줄 바꿈 문자가 포함되어 있습니다. 'strip()'은 줄 바꿈을 포함하여 공백을 제거합니다. 'not line.strip()을 사용하십시오 :' – khelwood

답변

2

readlines() 기능을 사용하면 자동으로 EOL 문자가 제거되지 않습니다. 그래서 하나가 라인의 끝에와 비교, 뭔가 같은 :

if line == os.linesep: 
    count += 1 

(당신은 물론 os 모듈을 가져와야합니다), 또는 (귀하의 질문에 @ khelwood의 의견에 의해 제안) 라인을 제거하고 비교하기 ''로 보내주십시오.

os.linesep을 사용하면 특정 OS에서 프로그램을 실행하는 경우 예상대로 작동하지 않을 수 있습니다. MacOS,하지만 당신이 검사하고있는 파일은 다른 OS (예. 리눅스, 줄 끝이 다를 수 있습니다. 모든 사례를 확인하려면 다음과 같이해야합니다.

if line == '\n' or line == '\r' or line == '\r\n': 
    count += 1 

희망이 있습니다. 보다 간단한 방법으로 파이썬

3

:

with open(filename) as fd: 
    count = sum(1 for line in fd if len(line.strip()) == 0) 

이 시간 선형 복잡도 및 메모리 일정한 복잡도를 유지한다. 그리고 무엇보다도 변수 count이 수동으로 증가 된 변수로 제거됩니다.

1

모든 줄은 줄 바꿈 문자 '\n'으로 끝납니다. 단 하나의 문자입니다.

쉬운 해결 방법은 라인이 '\n' 동일 어떠했는지를 확인하는 것입니다, 또는 그 길이 어떠했는지 1, 0이 아닌

+0

Windows에서 작성된 텍스트 파일에서 행은'\ r \ n '으로 끝나고 공백 행의 길이는 2가됩니다.'strip'을 사용하십시오. 그것을위한 것입니다. – Amadan

1

당신은 반복자를 반환 itertools에서 수를 사용할 수 있습니다. 게다가 길이를 확인하는 대신 스트립을 사용했습니다.

from itertools import count 

counter = count() 

with open('myfile.txt', 'r') as f: 
    for line in f.readlines(): 
     if not line.strip(): 
      counter.next() 

print counter.next() 
+0

정수를 추가해도 메모리 사용량은 증가하지 않습니다. – aluriak

+0

나는 정수가 얼마나 큰지에 달려 있다고 생각한다. – turkus

+0

네,하지만 요점은 아닙니다 : itertools.count는 최소한 수동 카운터만큼의 메모리를 사용합니다. – aluriak