줄 바꿈으로 구분 된 파일을 읽고 줄 바꿈을 버리는 가장 좋은 방법은 무엇입니까?


84

파이썬에서 줄 바꿈으로 구분 된 파일을 읽을 때 줄 바꿈 제거를 처리하는 가장 좋은 방법을 결정하려고합니다.

내가 생각 해낸 것은 테스트 할 일회용 코드를 포함하는 다음 코드입니다.

import os

def getfile(filename,results):
   f = open(filename)
   filecontents = f.readlines()
   for line in filecontents:
     foo = line.strip('\n')
     results.append(foo)
   return results

blahblah = []

getfile('/tmp/foo',blahblah)

for x in blahblah:
    print x

제안?


split ( "/ n")을 사용하는 것은 어떻습니까?
jle


나는 그것뿐만 아니라 파일을 닫으려면 더 좋을 거라 생각
파블 Prażak

답변:


196
lines = open(filename).read().splitlines()

이 답변은 내가하려는 일을 수행하며 오류 검사 등을 추가해야 할 것이지만이 특정 요구에 대해서는 훌륭합니다. 답변 해주셔서 감사합니다!
solarce

나는 이것을 좋아하지만 파일 핸들을 저장하지 않으면 어떻게 파일을 닫습니까? 아니면 자동으로 닫히나요?
IJ Kennedy

6
CPython을 사용하면 더 이상 사용하지 않으면 파일 객체에 대한 참조 수가 0이되고 파일이 자동으로 닫힙니다. Jython 및 IronPython과 같은 순전히 GC 구현의 경우 GC가 실행될 때까지 파일이 닫히지 않을 수 있습니다. 따라서이 간결한 변형은 최적이 아닐 수 있습니다.
Curt Hagenlocher

2
8GB RAM이 장착 된 Mac OS X 10.7.5에서 최대 2047MB의 파일을 읽을 수 있습니다 (내 정의 : 1MB = 1024 x 1024 바이트). 2048MB는 MemoryError 예외를 발생시킵니다.
Hai Vu 2013

1
@WKPlus 훌륭한 질문-대답은 "따라 다릅니다"입니다. stackoverflow.com/a/15099341/994153 (참조 횟수가 0으로 떨어지기 때문에 CPython이 닫을 수 있지만 다른 Python 구현에서는 닫지 않을 수 있으므로 명시 적으로 만드는 것이 가장 좋습니다. )
Colin D Bennett

23

요청한 것을 수행하는 생성기가 있습니다. 이 경우 rstrip을 사용하는 것이 충분하고 strip보다 약간 빠릅니다.

lines = (line.rstrip('\n') for line in open(filename))

그러나 후행 공백도 제거하기 위해 이것을 사용하고 싶을 것입니다.

lines = (line.rstrip() for line in open(filename))

()가 아니라 RHS 주변에 []이어야하지 않습니까?
andrewb

8
@andrewb ()를 사용하면 [] (목록 이해)를 사용하는 것만 큼 많은 메모리를 사용하지 않는 생성기 표현식이 제공됩니다.
Jonathan Hartley

9

이 접근 방식에 대해 어떻게 생각하십니까?

with open(filename) as data:
    datalines = (line.rstrip('\r\n') for line in data)
    for line in datalines:
        ...do something awesome...

생성기 표현식은 전체 파일을 메모리로로드하지 with않고 파일을 닫습니다.


이것은 본질적으로 TimoLinna의 @와 동일한 대답 ... 게시 년 사전
마티


4

생성기 표현식을 사용하십시오.

blahblah = (l.rstrip() for l in open(filename))
for x in blahblah:
    print x

또한 메모리에서 전체 파일을 읽지 않도록 조언하고 싶습니다. 생성기를 반복하는 것이 큰 데이터 세트에서 훨씬 더 효율적입니다.


3

나는 이것을 사용한다

def cleaned( aFile ):
    for line in aFile:
        yield line.strip()

그러면 이렇게 할 수 있습니다.

lines = list( cleaned( open("file","r") ) )

또는 추가 기능으로 clean을 확장하여 빈 줄을 삭제하거나 주석 줄을 건너 뛸 수 있습니다.


2

다음과 같이 할 것입니다.

f = open('test.txt')
l = [l for l in f.readlines() if l.strip()]
f.close()
print l

Curt Hagenlocher의 답변이 기술적으로 더 좋지만 각 라인에 다른 처리를 추가해야하는 경우이 답변이 좋은 출발점이됩니다.
TomOnTime

빈 줄을 필터링하려는 것인지 확실하지 않지만 이것은 ... if l.strip() is not ''필자의 경우에 필요한 것보다 더 간결 합니다.
Zach Young
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.