파일의 첫 줄만 읽습니까?


208

파이썬에서 파일의 첫 줄만 문자열로 어떻게 얻을 수 있습니까?


4
이미 파일을 읽은 경우 ( "파일을 읽은 후") 이미 첫 번째 줄을 읽은 것입니다! (한 줄 이상이 있다고 가정합니다.)
William Pursell

3
지금 말한 질문 원래와 다른 의미를 가지고 있습니다. 일부 파일은 "파일을 읽은 후"부분 (제거 된 부분)을 고려할 때 어리석은 것처럼 보입니다.
피터 한센

답변:


354

.readline()방법을 사용하십시오 ( Python 2 docs , Python 3 docs ).

with open('myfile.txt') as f:
    first_line = f.readline()

몇 가지 참고 사항 :

  1. 문서에서 언급했듯이 파일의 유일한 줄이 아니라면 반환 된 문자열 f.readline()에는 줄 바꿈 문자가 포함됩니다. f.readline().strip()줄 바꿈을 제거 하기 위해 대신 사용할 수 있습니다 .
  2. with문은 자동으로 다시 때 블록의 끝을 파일을 닫습니다.
  3. with문장은 Python 2.5 이상에서만 작동하며 Python 2.5에서는 사용해야합니다.from __future__ import with_statement
  4. Python 3에서는 열려는 파일의 파일 인코딩을 지정해야합니다. 더 읽어보기 ...

3
Python 3에서 파일이 ascii 또는 utf8 인 경우 파일 인코딩을 지정할 필요가 없습니다. 그렇지 않으면 파이썬 2에서 codecs.open에 인코딩을 지정해야합니다.
Evpok

2
@Evpok "파이썬 3에서는 파일이 ascii 또는 utf8 인 경우 파일 인코딩을 지정할 필요가 없습니다" – 엄격하게 만 해당되는 경우! 현실은 약간 더 지저분합니다. 문서에서 언급했듯이 사용되는 기본 인코딩은 플랫폼에 따라 다릅니다 (예를 들어 Python을 시작하는 방법에 따라 동일한 컴퓨터에서도 다를 수 있습니다) 을 사용하여 Apache를 실행할 때 mod_wsgi).
Mark Amery


20
fline=open("myfile").readline().rstrip()

나는 이것을 찾아 여기에왔다. 특히 rstrip()개행 문자를 제거하기 때문에 .
Shashank Sawant

5
-1; 이렇게하면 파일이 닫히지 않고 첫 번째 줄에 줄 바꿈 문자 외에 뒤에 공백이 있으면 잘못된 결과를 반환합니다.
Mark Amery

@MarkAmery : 실제로 파일 핸들이 변수에 할당되지 않았기 때문에 즉시 가비지 수집되어 파일을 닫습니다. (물론 컨텍스트 관리자를 사용하여 수용된 솔루션이 훨씬 더 좋습니다.)
acdr

@acdr 당신이 말을하는 것은 다른 파이썬 구현 CPython에 대한 사실이 아닌 것입니다 - 예를 참조 PyPy 가비지 컬렉션 문서 관심의 특정 지점으로 언급 "그들은 범위 밖으로 갈 때 파일이 ... 즉시 폐쇄되지 않습니다" . 이러한 이유로, 일반적으로 설명하는 동작에 의존하는 것은 나쁜 습관 이라고 주장합니다 (예 : stackoverflow.com/a/7396043/1709587 ).
Mark Amery


9

열린 파일의 시작 부분으로 돌아가서 첫 번째 줄을 반환하려면 다음과 같이하십시오.

my_file.seek(0)
first_line = my_file.readline()

1
그냥 더 나은 이해를 위해, 그것은 "my_file.seek (0) 라인 = my_file.readline ()"가 될 것입니다
알베르토 페레즈


6

여기에 많은 다른 대답이 있지만 @MarkAmery가 원래 질문을 편집하고 의미를 변경하기 전에 요청한 질문에 정확하게 대답 합니다 .

>>> f = open('myfile.txt')
>>> data = f.read()
>>> # I'm assuming you had the above before asking the question
>>> first_line = data.split('\n', 1)[0]

즉, 이미 파일에서 읽었고 메모리에 큰 데이터 블록이 있으면 첫 번째 줄을 효율적으로 얻으려면 줄 바꿈 문자에서 split ()을 한 번 수행하십시오. 결과 목록에서 첫 번째 요소를 가져옵니다.

여기에는 \n줄 끝에 문자가 포함되지 않지만 어쨌든 원하지 않는다고 가정합니다 (한 줄 파일에는 없을 수도 있음). 또한 매우 짧고 빠르지 만 데이터의 사본을 만들므로 실제로 많은 메모리가있는 경우이를 "효율적인"것으로 간주하지 않을 수 있습니다. 항상 그렇듯이 그것은 ...


8
이것이 큰 파일 인 경우, f.read ()는 전체 파일을 메모리에로드하려고 시도하는데, 이는 좋은 생각이 아닙니다. 대안은 줄 바꿈 할 때까지 한 번에 하나 개의 문자를 읽는 것 또는 EOF가 발생합니다
randomThought

실제로 다른 모든 대답은 그보다 더 나은 대안입니다. 일반적으로 readline () 및 friends를 사용하여 파일을 읽으면 한 번에 전체 블록을로드하고 (32K는주고 받음) 검색하여 다음 줄 바꿈을 찾습니다. 훨씬 빠르고 효율적입니다. 내 대답은 그가 이미 전체를로드 한 경우에만 유용 할 것입니다.이 경우 우리는 그가 모든 것을 메모리에 담아도 괜찮다고 가정 할 수 있습니다.
Peter Hansen

2
나는 그 의미가 바뀌 었다고 확신하지 못한다. 전체 파일을 "읽은"후 파일에서 첫 번째 줄을 "읽는"방법을 묻는 것은 의미가 없습니다. 따라서, 그 주장의 의도가 먼저 호출되어야 한다고 가정 하지 않았다는 것이 나에게는 명백하다 .read().
Mark Amery

@MarkAmery, 질문은 잘못 표현되었으므로 ( "꽤 의미가 없음") 의도 ( "나에게 명백한")를 추측하고 일치하도록 단어를 바 꾸었습니다. 내 해석이 다릅니다. 분명하고 harpalss 관계를 설명하지 않는 한, 우리는 모두 원래 문구 플러스 답변 그의 수용 될 때까지 (즉, "추구 (0)") 분명히 나에게있는 그가 것을 알 수 있었다 이미 적어도 첫 번째 줄을지나, 파일에서 읽습니다.
피터 한센

이 답변을 제거해야합니다. 그것은 올바른 방법이 아니며 사람들을 속일 수 있습니다.
thang

-15
f1 = open("input1.txt", "r")
print(f1.readline())

20
정확히이 접근법을 포함하는 5 세 이상의 여러 답변 있습니다. 다른 것을 추가하여 소음을 만드는 것 외에는 아무것도하지 않습니다.
Mark Amery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.