Read only the first line of a file?
如何使用python只得到文件的第一行作为字符串?
- 如果您已经阅读了文件("在阅读了文件之后"),那么您已经阅读了第一行!(假设至少有一行。)
- 请注意,现在所说的问题与原来的含义不同。有些答案现在看起来很愚蠢,因为他们考虑到了"在文件中阅读后"部分(已删除)。
使用.readline()方法(python 2 docs,python 3 docs):
1 2
| with open('myfile.txt') as f:
first_line = f.readline() |
一些注释:
如文档中所述,除非它是文件中的唯一一行,否则从f.readline()返回的字符串将包含一个尾随新行。您可能希望使用f.readline().strip()来删除换行符。
当块结束时,with语句自动再次关闭文件。
with语句仅在python 2.5和更高版本中有效,而在python2.5中,您需要使用from __future__ import with_statement。
在python 3中,您应该为打开的文件指定文件编码。多读…
- 在python 3中,如果文件是ascii或utf8,则不必指定文件编码。如果不是这样,您应该指定codecs.open在python 2中的编码。
- @evpok"在python 3中,如果文件是ascii或utf8,则不必指定文件编码"-如果这只是严格正确的话!实际情况稍显混乱;如docs中所述,所使用的默认编码依赖于平台(甚至在同一台计算机上也可能不同,这取决于您如何启动python——例如,我看到了在我的正常shell中工作的代码,假设在使用mod_wsgi运行apache时,utf-8随后会爆炸。
1 2
| infile = open('filename.txt', 'r')
firstLine = infile.readline() |
1
| fline=open("myfile").readline().rstrip() |
- 我是来找这个的。尤其是因为rstrip()删除了换行符。
- -1;这不会关闭文件,如果第一行除了换行符本身之外还包含任何尾随空格,则返回错误的结果。
- @markamery:实际上,因为文件句柄没有分配给变量,所以它会立即被垃圾收集,从而关闭文件。(当然,使用上下文管理器的公认解决方案仍然更好。)
- @acdr您所说的对于cpython是正确的,但对于其他的python实现则不是正确的-请参见pypy垃圾收集文档,其中提到"文件…如果超出范围,则不会立即关闭。出于这个原因,人们通常认为(例如在stackoverflow.com/a/7396043/1709587上),依赖你描述的行为是不好的做法。
应该这样做:
1 2
| f = open('myfile.txt')
first = f.readline() |
1
| first_line = next(open(filename)) |
- 这也会关闭文件吗?
- 最后,当python离开块时。
要返回打开文件的开头,然后返回第一行,请执行以下操作:
1 2
| my_file.seek(0)
first_line = my_file.readline() |
- 为了更好地理解,它将是"my_file.seek(0)line=my_file.readline()"
这里还有很多其他答案,但要准确回答您提出的问题(在@markamery去编辑原始问题并改变其含义之前):
1 2 3 4 5
| >>> f = open('myfile.txt')
>>> data = f.read()
>>> # I'm assuming you had the above before asking the question
>>> first_line = data.split('
', 1)[0] |
换句话说,如果您已经读取了文件(如您所说),并且在内存中有一大块数据,那么为了有效地从文件中获取第一行,只需对换行符执行split(),然后从结果列表中获取第一个元素。
注意,这不包括行尾的
字符,但我假设您无论如何都不想要它(而且一个单行文件甚至可能没有一个)。另外请注意,虽然它非常短和快速,但它确实会复制数据,因此对于一个真正大的内存块,您可能不认为它是"高效的"。一如既往,这取决于…
- 如果这是一个大文件,f.read()将尝试将整个文件加载到内存中,这不是一个好主意。另一种方法是一次读取一个字符,直到遇到换行符或EOF为止。
- 实际上,所有其他的答案都是更好的选择。通常,使用readline()和朋友读取一个文件时,会一次加载整个块,可能是32K的give或take,然后搜索该块以查找下一个换行符。更快更高效。我的答案只有在他已经加载了全部内容的情况下才有用,在这种情况下,我们可以假设他对所有内容都在内存中是满意的。
- 我不相信我改变了意思。在"读取"整个文件之后,询问如何"读取"文件的第一行是毫无意义的。因此,对我来说,很明显,询问者的意图不是假定必须首先调用.read()。
- @Markamery,这个问题的措词很差("相当没有意义"),所以你猜到了它的意图("对我来说很明显"),然后重新修改它来匹配。我的解释不同。很明显,在Harpals澄清之前,除非他澄清,否则我们只有原始措辞加上他接受了一个答案(即"seek(0)"),这对我来说清楚地表明他已经阅读了文件,至少超过了第一行。
- 你应该删除这个答案。这不是正确的方法,而且可以欺骗人们。
- @谢谢你的意见,但最初的问题是这样写的:我的回答是一个技术上有效的回答,而且是一个旨在帮助描述的情况的回答。我确实更新了它,表明这个问题被编辑了,措辞也改变了,我认为我的澄清有助于防止任何人"欺骗"。
- :)好吧,我是个懒惰的程序员。我在网上查找了代码,然后匆忙使用它来尝试运行一些东西来进行演示。出于某种原因,我的代码非常慢!花了一段时间才发现,这东西是加载到内存4GB,然后才采取第一行!Tor的答案实际上是"正确的"答案。做事情的方法很多。有些更好。有些更糟。这是一个糟糕的结局。把它放在最上面而不是Tor的答案,这让我很困扰。我以为因为它在上面,所以最好,所以我没有检查…废话。我想大部分是我的懒惰。
- 顺便问一下,问题是"只读取文件的第一行?",而不是"如何读取整个文件并获取第一行?"
- @唐,不,你错了。当我回答时,问题是"在读取一个文件之后,如何告诉python只读取第一行?"我认为这意味着这个家伙已经阅读了整个文件内容,想知道如何提取第一行。自从这个问题被编辑后,我就非常清楚了。
- 我认为你把这个问题解释错了。"只读取第一行"……不是"只取第一行",它可以用任何一种方式解释。我仍然认为应该放弃这个答案的排名。你能想到一个场景,你想用这个来代替托尔的答案吗?
- @唐卡,真的,我们在浪费所有还在读书的人的时间。你投了反对票,这就是你真正需要做的。至于"任何一种解释方式",是的,它可能是,这就是为什么我在提供一个选择一个有效解释的答案时没有错,即使它不可能是最好的解释。最后,是的,如果所有的数据都是由于其他原因被读取的,但是您仍然只需要第一行(并且您是一个新手程序员),那么您可能会问这个问题,并发现我的答案很有帮助。请就这样吧…没有人会被它迷惑。
解决方案1:
1 2 3 4 5 6
| with open('input_file.txt') as input_file:
lines=input_file.readlines()
for line_no, line in enumerate(lines):
if line_no == 0:
print(line)
break |
- lines包含来自input_file.txt的所有行。
- line_no将给出文件中的行号。
- 如果line_no为0,第一行将作为索引打印。从0开始
- 同样,如果你想要第二行,你可以写if line_no==1。
解决方案2:
1 2 3 4
| with open('input_file.txt') as input_file:
lines=input_file.readlines()
first_line=lines[0]
print(first_line) |
- lines[0]是第一行。
- 同样,lines[1]是第二行
解决方案3:
打印第一行N行。用任何数字替换N。如果你想要第一行,那么n=1
1 2 3 4 5
| from itertools import islice
with open('my_file.txt','r') as my_file:
head = list(islice(my_file, N))
print(head) |
这是unix命令head的等效代码。
解决方案4:
1 2 3 4 5
| with open('input.txt', 'r') as fin:
head, tail = fin.read().split('
', 1)
print(head)
#print(tail) |
1 2
| f1 = open("input1.txt","r")
print(f1.readline()) |
- 在五年多的时间里,有很多答案都包含着这种方法。你什么都没做,只是通过添加另一个来制造噪音。