2012-01-17 4 views
2

readlines 함수를 사용하여 파일의 모든 줄을 읽는 코드가 있고 목록의 각 줄을 더 파싱합니다. 그러나 목록을 인쇄 할 때 루프가 파일의 마지막 줄을 무시하고 있음을 알았습니다. 파일에 빈 줄을 삽입하면 모든 내용이 읽혀집니다. 그 이유를 pls 말해 줄 수readlines는 파이썬에서 파일의 마지막 줄을 읽지 않습니다.

def readFile1(file1): 
    f = file1.readlines() 
    cList1 = [] 
    for line in f: 
     if re.findall('\n',line): 
      v = re.sub('\n','',line) 
     cList1.append(v) 

    print cList1 

이 파일의 마지막 줄을 제외한 모든 내용을 인쇄합니다.

+2

마지막 줄 다음에 줄 바꿈이 있습니까? – joaquin

+1

우리는 정규 표현식을 사용하여 특정 위치 (문자열의 끝)에서 한 번만 발견 될 수있는 단일 문자의 "모든 인스턴스"를 제거하고 있습니까? 정말? 이것은 펄이 아닙니다. 정규식은 큰 실수입니다. 이런 식으로 코드를 작성하면 의도가 가려져 혼자 힘들게 만듭니다. –

답변

11

마지막 줄이 개행 문자로 끝나지 않으면 코드에서 cList1에 코드를 추가하지 않습니다. 대신, 두 번째 사본을 두 번째로 추가합니다 (여전히 v에 저장 됨). 실제로,

cList1 = [] 
for line in f: 
    cList1.append(line.rstrip('\n')) 

또는 :

그 루프를 작성하는 청소기 방법은

cList1 = [line.rstrip('\n') for line in f] 

사실, 나는 완전히 readlines() 호출을 피할 것 :

def readFile1(file1): 
    cList1 = [line.rstrip('\n') for line in file1] 
    print cList1 
+0

예 u r 오른쪽 .. v에 저장된 줄의 두 번째 복사본을 추가하고 있습니다 ... 여기에 제안한 방법을 시도하십시오 – rain

0

당신의 마지막 행에는 \ n 문자가 없습니다. 그 행 다음에 새 행이 없기 때문입니다.

0

print f은 실제로 모든 행을 인쇄합니다. 코드의 버그입니다. 마지막 줄에 \n이 없으므로 두 번째 줄부터 마지막 ​​줄까지 두 번 추가합니다. 예를 들어 누락되었습니다. else 블록에 \n이 포함되지 않은 경우 v을 할당하는 블록

+0

예이 경우 수도 있습니다 .. – rain

1

파일의 모든 줄을 목록으로 가져오고 싶다면 훨씬 더 편리하고 내 의견으로는 입니다.

def readFile1(file1): 
    cList1 = file1.read().splitlines() 
    print cList1 

이 경우 발전기를 사용할 필요가 없다고 생각합니다. 또한 벤치마킹 (Windows)하고 @aix가 제공 한 생성기 양식은 인 경우 약간 더 느립니다..

>>> import timeit 
>>> import os 
>>> 
>>> # Setup 
>>> open('testfile', 'w').write('This Is A Test' * 500) 
>>> 
>>> # Time generator form (ten thousand times) 
>>> timeit.timeit("lst = [line.rstrip('\\n') for line in open('testfile')]", 
...  number=10000) 
2.656837282256163 
>>> 
>>> # Time splitlines() form (ten thousand times) 
>>> timeit.timeit("lst = open('testfile').read().splitlines()", number=10000) 
1.3464799954204238 
>>> 
>>> # Cleanup 
>>> os.remove('testfile') 
관련 문제