[python] 특정 줄만 읽기

파일을 읽기 위해 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