仅读取文件的第一行?


208

如何使用Python仅将文件的第一行作为字符串?


4
如果您已经阅读了文件(“读入文件之后”),那么您已经阅读了第一行!(假设至少有一条线。)
威廉·珀塞尔

3
请注意,现在所说的问题原来的含义不同。现在,由于考虑到“读入文件后”部分(已删除),一些答案显得很愚蠢。
彼得·汉森

Answers:


354

使用.readline()方法(Python 2文档Python 3文档):

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

2
@Evpok “在Python 3中,如果文件是ascii或utf8,则不必指定文件编码” -如果仅严格遵守!现实有点混乱。如文档中所述,使用的默认编码取决于平台(并且在同一台计算机上可能会有所不同,具体取决于您启动Python的方式-例如,我通过假定UTF-8稍后爆炸看到了在我的普通Shell上工作的代码)通过mod_wsgi)在Apache中运行时。
Mark Amery


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

我是来这里找的。特别是因为rstrip()删除了换行符。
Shashank Sawant 2014年

5
-1; 这不会关闭文件,并且如果第一行除换行符本身之外还包含任何尾随空格,则返回错误结果。
Mark Amery

@MarkAmery:实际上,由于未将文件句柄分配给变量,因此会立即对其进行垃圾回收,从而关闭文件。(尽管,当然,使用上下文管理器接受的解决方案仍然好得多。)
acdr

@acdr您所说的内容仅适用于CPython,但不适用于其他Python实现-请参阅例如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()”
Alberto Perez

7
first_line = next(open(filename))

1
这也会关闭文件吗?
abalter

最终,当Python离开该块时。
vy32

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()和好友读取文件会一次加载整个块,可能是32K允许或接受,然后在其中搜索以找到下一个换行符。更快,更高效。我的答案只有在他已经加载了整个内容的情况下才有用,在这种情况下,我们可以假设他可以将所有内容存储在内存中。
彼得·汉森

2
我不相信我改变了意思。问“读取”整个文件后如何从文件“读取”第一行是毫无意义的。因此,对我来说很明显,询问者的意图不是假定.read()必须首先调用它。
Mark Amery

@MarkAmery,问题措辞不佳(“毫无意义”),因此您猜到了意图(“对我来说很明显”),并将其改写为匹配项。我的解释不同。显然,直到除非harpalss弄清楚,否则我们所拥有的只是原始措辞加上他对答案的接受(即“ seek(0)”),对我而言,这清楚地表明他至少在第一行之前已经读过文件。
彼得·汉森

您应该删除此答案。这不是正确的方法,并且会欺骗他人。
thang

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

20
五年多来,有很多答案都包含了这种方法。您什么也没有做,只是通过添加另一个来制造噪音。
马克·阿默里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.