ファイルの最初の行のみを読み取りますか?


209

Pythonでは、ファイルの最初の行だけを文字列としてどのように取得しますか?


4
すでにファイルを読んでいる場合(「ファイルを読み込んだ後」)は、すでに最初の行を読んでいることになります。(少なくとも1行あると仮定します。)
ウィリアムパーセル2009

3
現在述べられている質問は、最初の質問とは意味が異なることに注意してください。「ファイルを読み込んだ後」の部分(削除されました)を考慮に入れると、いくつかの回答はばかげて見えます。
Peter Hansen

回答:


354

.readline()メソッドを使用します(Python 2 docsPython 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の場合、ファイルエンコーディングを指定する必要はありません。そうでない場合は、とにかくPython 2でcodecs.openへのエンコーディングを指定する必要があります。
Evpok 2012

2
@Evpok "Python 3では、ファイルがasciiまたはutf8の場合、ファイルエンコーディングを指定する必要はありません" -それが厳密に当てはまる場合のみ!現実は少し厄介です。ドキュメントに記載されているように、使用されるデフォルトのエンコーディングはプラットフォームに依存します(Pythonの起動方法によっては同じコンピューターでも異なる場合があります-たとえば、UTF-8が後で爆発すると想定して通常のシェルで動作するコードを見ましたでApacheを実行する場合mod_wsgi)。
Mark Amery 2016年


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

私はこれを探してここに来ました。特にrstrip()、改行文字が削除されるためです。
Shashank Sawant 2014年

5
-1; これはファイルを閉じず、最初の行に改行文字以外の末尾の空白が含まれている場合、誤った結果を返します。
Mark Amery 2016年

@MarkAmery:実際には、ファイルハンドルは変数に割り当てられていないため、すぐにガベージコレクションされ、ファイルが閉じられます。(もちろん、コンテキストマネージャーを使用した受け入れ済みソリューションの方がはるかに優れています。)
acdr

@acdr CPythonには当てはまるが他のPython実装には当てはまらない-たとえば、「ファイル...がスコープ外に出たときにすぐに閉じられない」という特定の興味のあるポイントとして言及されているPyPyガベージコレクションのドキュメントを参照してください。このため、記述した動作に依存することは悪い習慣であると一般に主張されています(例:stackoverflow.com/a/7396043/1709587)。
マークアメリー2018年


9

開いているファイルの最初に戻って最初の行を返すには、次のようにします。

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

1
よりよく理解するために、「my_file.seek(0)line = my_file.readline()」
Alberto Perez

7
first_line = next(open(filename))

1
これはファイルも閉じますか?
abalter

最終的に、Pythonがブロックを離れたとき。
vy32 2018

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行末の文字が含まれていないことに注意してください。ただし、とにかくそれを必要としないことを前提としています(1行のファイルには1つもない場合があります)。また、非常に短くて迅速ですが、データのコピーを作成するため、メモリの非常に大きなblobの場合、「効率的」とは見なされない場合があります。いつものように、状況によります...


8
これが大きなファイルである場合、f.read()はファイル全体をメモリにロードしようとしますが、これは良い考えではありません。代替は、改行またはEOFが検出されるまで、一度に1つの文字を読むことであろう
randomThought

実際、他のすべての答えはそれよりも優れた選択肢です。通常、readline()などでファイルを読み取ると、一度にブロック全体が読み込まれ、32Kのギブまたはテイクが行われ、それを検索して次の改行を見つけます。はるかに高速で効率的です。私の答えは、彼がすでにすべてをロードしている場合にのみ役立ちます。その場合、彼がすべてをメモリに入れても大丈夫であると想定できます。
Peter Hansen、

2
意味が変わったとは思いません。ファイル全体を「読み取った」後、ファイルから最初の行を「読み取る」方法を尋ねるのはかなり意味がありません。そのため、質問者の意図は、それ.read()最初に呼び出す必要があると想定することではなかったことは、私にはかなり明白です。
Mark Amery 2016年

@MarkAmery、質問の文言が不十分だったため(「かなり意味のない」)、意図を推測し(「私には自明」)、一致するように言い換えました。私の解釈は異なります。はっきりとharpalss明確化しない限り、我々が持っているすべては、元の文言を加えた答えの彼の受諾されるまで(つまり、「求める(0)」)、明らかに私にその彼がいることを示していたすでに少なくとも最初の行を過ぎて、ファイルを読み込みます。
Peter Hansen、

この答えは削除してください。それは正しい方法ではなく、人々をだますことができます。
タン

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

20
まさにこのアプローチを含む、5年以上にわたる複数の回答があります。別のノイズを追加して、ノイズを発生させるだけです。
マークアメリー2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.