2016-06-29 4 views
6

내가 열어 본 파일을 반복 할 때 "읽는"일을하지 않고 반복하는 것이 훨씬 빠르다는 것을 알게되었습니다. 즉Python : 언제 file.read() 또는 file.readlines()를 사용해야합니까?

l = open('file','r') 
for line in l: 
    pass (or code) 

은 약 1.5 배 많은 시간이 걸릴 것

l = open('file','r') 
for line in l.read()/l.readlines(): 
    pass (or code) 

제 2 회 루프보다 훨씬 빠른 (I가 동일한 파일을 통해 timeit를 사용하고, 결과는 대 0.442이었다 0.660), 동일한 결과를 얻을 것이다.

그렇다면 .read() 또는 .readlines()를 언제 사용해야합니까?

필자가 읽고있는 파일을 반복 할 필요가 있고 어려운 방법을 배운 후에 .read()가 큰 데이터에있을 수 있습니다. 나는 다시 사용하는 것을 상상할 수 없습니다.

+4

명확히하십시오. 'read' 또는'readlines'에 대한'timeit' 측정 값입니까?나는'read' 루프가 단일 문자열을 반환하기 때문에 더 오래 걸릴 것으로 기대하고 있습니다. 그래서 iterating은 문자 단위로 갈 것입니다. 파일 당 평균 100 자의 문자가 있다면'for line in l.read()'루프의 코드는'for line in l :'루프의 코드의 백 배만큼 실행됩니다. – Kevin

+0

그것은 또한 readlines()입니다. 놀랍게도 read() 또는 readlines() 사이에는 거의 시차가 없습니다 ... –

답변

4

짧은 대답은 파일의 비트를 읽는 세 가지 방법 중 각각 다른 사용 사례를 가지고있다. 위에서 언급했듯이 f.read()는 파일을 개별 문자열로 읽으므로 파일 전체 정규식 검색 또는 대체와 같이 비교적 쉽게 파일 전체를 조작 할 수 있습니다.

f.readline()은 파일의 한 줄을 읽음으로써 사용자가 반드시 전체 파일을 읽지 않고 한 줄을 구문 분석 할 수 있도록합니다. f.readline()을 사용하면 파일이 부분적으로 포맷을 변경하는 경우와 같이 전체 행 반복보다 파일 읽기에서 논리를 더 쉽게 적용 할 수 있습니다.

for line in f: 구문을 사용하면 사용자는 질문에서 언급 한대로 파일을 한 행씩 반복 할 수 있습니다.

는 (다른 답변에서 언급 한 바와 같이,이 문서는 아주 좋은 읽기입니다) :

https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

편집 : 그것은 이전의 readline()를하는 동안 라인을 건너 뛸 수 있다고 주장했다 for 루프 반복. 그러나 이것은 파이썬 2.7에서 작동하지 않으며 의심스러운 관행이므로이 주장은 삭제되었습니다.

편집 : 추가 f.readline()와 f.read의 사용 경우의 예()

+1

'readline'과'for' 루프를 파일에 섞어 쓰는 것은 실제로 작동하지 않습니다; 'readline'은'next' 구현의 버퍼링을 이해하지 못합니다. 'for' 루프에서 한 줄 건너 뛰고 싶다면, 파일에'next'를 호출해야합니다. – user2357112

+0

방금 ​​파이썬 3.4에서 테스트했습니다. readline()은 루프 버퍼를 앞으로 이동시킵니다. 파이썬 2를 정말 빠르게 확인합시다. – Checkmate

+0

아, 파이썬 2.7에 맞습니다. 내 대답을 편집 할게. 고마워, 알아두면 좋다! – Checkmate

0

희망이 도움이됩니다. 크기가 생략되거나 제외하면

https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

는 파일의 전체 내용을 읽고이를 반환 할 것이다

; 파일이 컴퓨터의 메모리 크기의 두 배인 경우 문제가됩니다.

모든 편집을 죄송합니다.

파일에서 행을 읽으려면 파일 객체를 반복 할 수 있습니다. 이것은 빠르고 메모리 효율적이며, 간단한 코드로 연결 : 귀하의 질문에

for line in f: 
    print line, 

This is the first line of the file. 
Second line of the file 
+0

C 또는 Python 용 API에 대한 정확한 설명이 아닙니다. – user2357112

+0

나는 그것을 잘 설명하지 않을 것이라고 생각했기 때문에 나머지 부분을 문서에서 곧바로 가져 왔습니다. – Rudi

+0

C는 파일을 한 줄씩 읽는 것이 기본값이 아닙니다. C에서 파일을 한 줄씩 읽는 표준 함수조차 없습니다. 'getline'은 POSIX 확장입니다. 또한,'f.read()'에 대한 반복문은 각 반복마다 전체 파일을 읽지 않으며, 반복문을 반복하지 않는다. – user2357112