2009-12-15 122 views
122

你會如何獲得一個文件的第一行作爲Python的字符串?只讀取文件的第一行?

+2

如果您已經閱讀文件(「閱讀後在一個文件中「),你已經閱讀了第一行! (假設至少有一行) – 2009-12-15 02:50:50

+1

請注意,現在的問題*與原來的含義不同。現在有些答案看起來很愚蠢,因爲他們考慮到「閱讀文件後」部分(已被刪除)。 – 2016-08-03 12:42:23

回答

6

這應做到:

f = open('myfile.txt') 
first = f.readline() 
16
infile = open('filename.txt', 'r') 
firstLine = infile.readline() 
+8

你沒有關閉文件。 [用'with'解決方案](http://stackoverflow.com/a/1904455/855050)更好。 – becko 2015-12-21 18:43:19

210

使用.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,你應該指定你打開該文件的文件編碼。 Read more...
+3

在Python 3中,如果文件是ascii或utf8,則不必指定文件編碼。如果不是,你應該在Python 2中將編碼指定爲codecs.open。 – Evpok 2012-07-19 12:15:02

+0

@Evpok *「在Python 3中,如果文件是ascii或utf8,則不必指定文件編碼」* - 如果這只是嚴格正確的!現實情況稍微凌亂;如文檔中所述,所使用的默認編碼是依賴於平臺的(甚至可能在同一臺計算機上有所不同,具體取決於您如何啓動Python - 例如,我已經看到通過假設UTF-8稍後爆發當用'mod_wsgi'通過Apache運行時)。 – 2016-10-23 22:49:28

10
fline=open("myfile").readline().rstrip() 
+0

我來這裏尋找這個。特別是因爲'rstrip()'刪除了換行符。 – 2014-10-27 09:19:59

+3

-1;這不會關閉文件,並且如果第一行包含除換行符本身之外的任何尾隨空格,則會返回不正確的結果。 – 2016-10-23 22:51:35

+0

@MarkAmery:實際上,因爲文件句柄沒有分配給一個變量,所以它立即被垃圾收集,這會關閉文件。 (當然,使用上下文管理器的接受解決方案仍然好得多。) – acdr 2018-01-19 09:07:56

8

這裏其他的答案很多,但回答精確你問(前@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字符,但我假設您不想要它(並且單行文件甚至可能沒有)。還要注意,儘管它非常短暫且快速,但它確實複製了數據,因此對於非常大的內存塊,您可能不會認爲它是「高效的」。與往常一樣,這取決於...

+7

如果這是一個大文件,f.read()會嘗試將整個文件加載到內存中,這不是一個好主意。另一種方法是一次讀取一個字符,直到遇到換行符或EOF爲止 – randomThought 2009-12-15 03:04:57

+0

實際上,所有其他答案都是比這更好的替代方案。通常使用readline()和朋友閱讀文件一次將加載整個塊,也許32K給予或帶走,並通過搜索找到下一個換行符。更快,更高效。我的回答只有在他已經*加載整個事情的時候纔會有用,在這種情況下,我們可以假設他將所有內容全部放在了一起可以。 – 2009-12-15 03:23:51

+2

我不相信我改變了意思。在「讀取」整個文件之後,如何從文件中「讀取」第一行是沒有意義的。因此,對我來說很明顯,提問者的意圖不是假設必須首先調用'.read()'。 – 2016-10-17 20:18:34

6

要返回一個打開的文件的開頭,這樣做:

my_file.seek(0) 
+1

只是爲了更好的理解,這將是「my_file.seek(0) line = my_file.readline()」 – 2016-09-04 14:59:43

6
first_line = next(open(filename)) 
+1

這是否也關閉該文件? – abalter 2016-11-18 07:24:05

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

五年內有多個答案,包含*正是這種方法*。你什麼都不做,只是增加另一個而產生噪音。 – 2015-07-05 14:44:36