파일을 읽기 위해 for 루프를 사용하고 있지만 줄 # 26 및 # 30과 같은 특정 줄만 읽으려고합니다. 이를 달성하기위한 내장 기능이 있습니까?
감사
답변
읽을 파일이 크고 메모리에서 전체 파일을 한 번에 읽고 싶지 않은 경우 :
fp = open("file")
for i, line in enumerate(fp):
if i == 25:
# 26th line
elif i == 29:
# 30th line
elif i > 29:
break
fp.close()
참고 i == n-1
에 대한 n
라인 째.
Python 2.6 이상에서 :
with open("file") as fp:
for i, line in enumerate(fp):
if i == 25:
# 26th line
elif i == 29:
# 30th line
elif i > 29:
break
답변
빠른 답변 :
f=open('filename')
lines=f.readlines()
print lines[25]
print lines[29]
또는:
lines=[25, 29]
i=0
f=open('filename')
for line in f:
if i in lines:
print i
i+=1
linecache ( “python : 거대한 텍스트 파일에서 특정 줄로 건너 뛰는 방법”) : 많은 행을 추출하기위한보다 우아한 솔루션이 있습니다. , 이전 stackoverflow.com 질문) 있습니다.
위에 링크 된 파이썬 문서 인용하기 :
>>> import linecache
>>> linecache.getline('/etc/passwd', 4)
'sys:x:3:3:sys:/dev:/bin/sh\n'
변경 4
원하는 줄 번호로 됩니다. 카운트가 0부터 시작하므로 4는 다섯 번째 줄을 가져옵니다.
파일이 매우 커서 메모리를 읽을 때 문제가 발생하면 @Alok의 조언 을 받아 enumerate ()를 사용 하는 것이 좋습니다 .
결론적으로:
- 작은 파일을위한 빠른 솔루션으로
fileobject.readlines()
또는 사용하십시오for line in fileobject
. linecache
더 많은 파일을 읽는 데 매우 빠른 더 우아한 솔루션을 사용 하면 반복적으로 가능합니다.- @Alok의 조언을
enumerate()
받아 용량이 크거나 메모리에 맞지 않는 파일에 사용 하십시오. 파일을 순차적으로 읽으므로이 방법을 사용하면 속도가 느려질 수 있습니다.
답변
빠르고 컴팩트 한 접근 방식은 다음과 같습니다.
def picklines(thefile, whatlines):
return [x for i, x in enumerate(thefile) if i in whatlines]
이것은 열려있는 파일과 같은 객체 thefile
(디스크 파일에서 또는 소켓이나 다른 파일과 같은 스트림을 통해 열어야하는지 여부를 호출자에게 맡김)와 0부터 시작하는 라인 인덱스 집합을 받아들이고 whatlines
, 메모리 풋 프린트가 낮고 속도가 적당합니다. 리턴되는 라인 수가 많으면 생성기를 선호 할 수 있습니다.
def yieldlines(thefile, whatlines):
return (x for i, x in enumerate(thefile) if i in whatlines)
이것은 기본적으로 루핑에만 적합합니다-유일한 차이점은 return
명령문 에서 사각형 괄호 대신 둥근 괄호를 사용하여 목록 이해와 생성기 표현식을 만드는 것입니다.
또한 노트 ‘선’과의 언급에도 불구하고 “파일”이 기능은 많은 것을, 훨씬 더 일반적으로는 – 그들은 작동합니다 모든 항목의 목록 (또는 발전기를) 반환, 그것을 열린 파일 또는 어떤 다른 일, 반복 가능한 점진적인 항목 번호를 기준으로합니다. 따라서 더 적절한 일반 이름을 사용하는 것이 좋습니다 .-).
답변
다른 솔루션을 제공하기 위해 :
import linecache
linecache.getline('Sample.txt', Number_of_Line)
나는 이것이 쉽고 빠르기를 바랍니다 🙂
답변
7 행을 원한다면
line = open ( "file.txt", "r"). readlines () [7]
답변
완전성을 위해 여기에 또 하나의 옵션이 있습니다.
슬라이스 일반적으로 시퀀스의 일부를 포함하는 객체입니다. variable_name [1 : 3 : 5]와 같이 몇 개가 주어지면 숫자 사이에 콜론이있는 첨자 표기법 []을 사용하여 슬라이스를 만듭니다. 대괄호 (첨자) 표기법은 슬라이스 객체를 내부적으로 (또는 이전 버전 인 __getslice __ () 및 __setslice __ ()) 사용합니다.
슬라이스 표기법이 일반적으로 반복자에 직접 적용되지는 않지만 itertools
패키지에는 대체 기능이 포함되어 있습니다.
from itertools import islice
# print the 100th line
with open('the_file') as lines:
for line in islice(lines, 99, 100):
print line
# print each third line until 100
with open('the_file') as lines:
for line in islice(lines, 0, 100, 3):
print line
함수의 또 다른 장점은 반복자가 끝날 때까지 반복자를 읽지 않는다는 것입니다. 따라서 더 복잡한 작업을 수행 할 수 있습니다.
with open('the_file') as lines:
# print the first 100 lines
for line in islice(lines, 100):
print line
# then skip the next 5
for line in islice(lines, 5):
pass
# print the rest
for line in lines:
print line
그리고 원래 질문에 대답하기 위해 :
# how to read lines #26 and #30
In [365]: list(islice(xrange(1,100), 25, 30, 4))
Out[365]: [26, 30]
답변
파일을 읽는 것은 엄청나게 빠릅니다. 100MB 파일을 읽는 데 0.1 초 미만이 소요됩니다 ( Python으로 파일 읽기 및 쓰기 참조) ). 따라서 당신은 그것을 완전히 읽고 한 줄로 작업해야합니다.
대부분의 대답은 잘못된 것이 아니라 나쁜 스타일입니다. 파일 열기는 항상 다음을 수행해야합니다with
다시 닫을 수 있도록 파일을 열어야합니다.
따라서 다음과 같이해야합니다.
with open("path/to/file.txt") as f:
lines = f.readlines()
print(lines[26]) # or whatever you want to do with this line
print(lines[30]) # or whatever you want to do with this line
거대한 파일
파일이 많고 메모리 소비가 중요한 경우 파일을 한 줄씩 처리 할 수 있습니다.
with open("path/to/file.txt") as f:
for i, line in enumerate(f):
pass # process line i