只读取文件的第一行?

Posted

技术标签:

【中文标题】只读取文件的第一行?【英文标题】:Read only the first line of a file? 【发布时间】:2010-12-26 15:20:17 【问题描述】:

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

【问题讨论】:

如果你已经读过文件(“读入文件后”),那么你已经读过第一行! (假设至少有一行。) 请注意,问题as now worded 与最初的含义不同。有些答案现在看起来很傻,因为它们考虑到了“读入文件后”部分(已被删除)。 【参考方案1】:

使用.readline() 方法(Python 2 docs、Python 3 docs):

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

一些注意事项:

    如文档中所述,除非它是文件中的唯一行,否则从 f.readline() 返回的字符串将包含尾随换行符。您可能希望使用 f.readline().strip() 来删除换行符。 with 语句会在块结束时再次自动关闭文件。 with 语句仅适用于 Python 2.5 及更高版本,而在 Python 2.5 中您需要使用 from __future__ import with_statement 在 Python 3 中,您应该为打开的文件指定文件编码。 Read more...

【讨论】:

在 Python 3 中,如果文件是 ascii 或 utf8,则不必指定文件编码。如果不是,你应该在 Python 2 中指定 codecs.open 的编码。 @Evpok “在 Python 3 中,如果文件是 ascii 或 utf8,则不必指定文件编码” - 如果这完全正确!现实稍微混乱一些;如文档中所述,使用的默认编码是平台相关的(甚至在同一台计算机上也可能有所不同,具体取决于您启动 Python 的方式 - 例如,我已经看到假设 UTF-8 之后在我的普通 shell 上工作的代码会爆炸当通过 Apache 运行 mod_wsgi)。 您可能想要first_line = f.readline().strip(),因为如果文件中有不止一行,则该行将包含换行符【参考方案2】:
infile = open('filename.txt', 'r')
firstLine = infile.readline()

【讨论】:

您没有关闭文件。 solution with with 更好。【参考方案3】:
fline=open("myfile").readline().rstrip()

【讨论】:

我是来找这个的。特别是因为rstrip() 删除了换行符。 -1;这不会关闭文件,并且如果第一行包含除换行符本身之外的任何尾随空格,则返回不正确的结果。 @MarkAmery:实际上,因为文件句柄没有分配给变量,所以它立即被垃圾收集,从而关闭了文件。 (当然,使用上下文管理器的公认解决方案仍然要好得多。) @acdr 您所说的对于 CPython 是正确的,但对于其他 Python 实现则不然——参见例如PyPy garbage collection docs 作为一个特别的兴趣点提到“文件...超出范围时不会立即关闭”。出于这个原因,人们通常认为(例如在***.com/a/7396043/1709587)依赖您描述的行为是不好的做法。【参考方案4】:

要返回打开文件的开头然后返回第一行,请执行以下操作:

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

【讨论】:

为了更好理解,应该是 "my_file.seek(0) line = my_file.readline()"【参考方案5】:
first_line = next(open(filename))

【讨论】:

这是否也会关闭文件? 最终,当 Python 离开区块时。【参考方案6】:

应该这样做:

f = open('myfile.txt')
first = f.readline()

【讨论】:

【参考方案7】:

这里有很多其他答案,但要准确地回答您提出的问题(在@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 字符,但我假设您无论如何都不想要它(单行文件甚至可能没有)。另请注意,尽管它非常简短且快速,但它确实会复制数据,因此对于非常大的内存块,您可能不会认为它“高效”。与往常一样,这取决于...

【讨论】:

如果这是一个大文件,f.read() 将尝试将整个文件加载到内存中,这不是一个好主意。另一种方法是一次读取一个字符,直到遇到换行符或 EOF 实际上,所有其他答案都是比这更好的选择。通常使用 readline() 和朋友读取文件会一次加载整个块,可能是 32K 给或取,然后搜索以找到下一个换行符。更快,更高效。只有当他已经加载整个内容时,我的回答才会有用,在这种情况下,我们可以假设他可以将所有内容都放在内存中。 我不相信我改变了意思。在“读取”整个文件之后询问如何从文件中“读取”第一行是毫无意义的。因此,对我来说很明显,提问者的意图不是假设必须首先调用.read() @MarkAmery,这个问题的措辞很糟糕(“毫无意义”),所以你猜到了意图(“对我来说很明显”)并改写了它以匹配。我的解释不同。很明显,除非 harpalss 澄清,否则我们所拥有的只是原始措辞加上他对答案的接受(即“seek(0)”),这对我来说清楚地表明他已经已经阅读了文件,至少超过第一行。 @thang,真的,我们在浪费大家还在阅读的时间。你投了反对票,这就是你真正需要做的。至于“以任何一种方式解释”,是的,可能是,这就是为什么我提供一个选择一种有效解释的答案并没有错,即使它不太可能是最好的解释。最后,是的,如果由于其他原因已读入所有数据,但您仍然只想要第一行(并且您是新手程序员),您可能会问这个问题并发现我的回答很有帮助。请放手吧……没有人会被它弄糊涂。【参考方案8】:

如果你想阅读file.txt

line1 helloworld

import linecache
# read first line
print(linecache.getline('file.txt'), 1)
>helloworld

【讨论】:

对我来说最好的选择:但是你有一个语法错误(括号应该在外面):第二行应该如下: print(linecache.getline('file.txt', 1) )【参考方案9】:
f1 = open("input1.txt", "r")
print(f1.readline())

【讨论】:

有多个超过五年的答案包含正是这种方法。你只是通过添加另一个来制造噪音。

以上是关于只读取文件的第一行?的主要内容,如果未能解决你的问题,请参考以下文章

Apache POI只读取大型Excel文件的第一行

如何使用 cat 读取文件的第一行?

在 Ruby 中读取文件的第一行

While 循环在 Bash 的第一行之后停止读取

python读取指定目录中所有文本文件的第一行,并以此为该文本文件名重命名

使用 Pyspark 使用 Spark 读取巨大 Json 文件的第一行