题 使用python,如何从第七行开始读取文件?


我有一个文本文件结构:

date
downland

user 

date data1 date2
201102 foo bar 200 50
201101 foo bar 300 35

因此不需要前六行文件。文件名:dnw.txt

f = open('dwn.txt', 'rb')

如何从第7行开始将此文件“拆分”为EOF?


12
2018-02-01 15:22


起源


一般来说,你会如何逐行读取文件?你的教程解释了吗? - SilentGhost
可能重复 从第2行读取文件或跳过标题行 - SilentGhost
我的教程。没有一个....我最经常使用的方法是???? split(“\ r \ n”):这是你的问题吗? - Merlin
读 正确的教程 - SilentGhost
为什么要以二进制模式读取文本文件? - John Machin


答案:


with open('dwn.txt') as f:
    for i in xrange(6):
        f.next()
    for line in f:
        process(line)

24
2018-02-01 18:12



这两个(迄今为止)匿名下来的人是否有机会分享他们的智慧? - John Machin
老实说,这是最惯用的解决方案,代码直接告诉你它的作用。 - Josh Lee
@john有糟糕的一天???我需要导入哪些模块来测试你的代码......“进程”的扼流圈。 - Merlin
@ user428862: process(line) 是伪代码“在这里插入你自己的代码来做任何你想做的事情 line“。什么样的代码是”你的“代码? - John Machin
这不会起作用 Python 3.x。得到 AttributeError: '_io.TextIOWrapper' object has no attribute 'next' - Andersson


Itertools回答!

from itertools import islice

with open('foo') as f:
    for line in islice(f, 6, None):
        print line

6
2018-02-01 15:32



这比它需要的更复杂。 - Merlin
如果你想使用itertools那么 islice 会是一个更好的选择。 - Jochen Ritzel
@Jochen islice, 谢谢。我正在寻找一种叫做“掉落”的东西,找不到任何东西。 - Josh Lee
-1用大锤敲打坚果 - John Machin
这是一把大锤怎么样?它需要一行设置。 - recursive


with open('test.txt', 'r') as fo:
   for i in xrange(6):
       fo.next()
   for line in fo:
       print "%s" % line.strip()

4
2018-02-01 15:37





事实上,准确地回答这个问题

How do I "split" this file starting at line 7 to EOF?

你可以做

如果文件不大:

with open('dwn.txt','rb+') as f:
    for i in xrange(6):
        print f.readline()
    content = f.read()
    f.seek(0,0)
    f.write(content)
    f.truncate()

如果文件很大

with open('dwn.txt','rb+') as ahead, open('dwn.txt','rb+') as back:
    for i in xrange(6):
        print ahead.readline()

    x = 100000
    chunk = ahead.read(x)
    while chunk:
        print repr(chunk)
        back.write(chunk)
        chunk = ahead.read(x)
    back.truncate()

截短() 功能是你要求的EOF必不可少的。没有执行 截短() ,文件的尾部,对应于6行的偏移,将保留。

文件 必须 以二进制模式打开以防止任何问题发生。

当Python读取时 '\ r \ N' ,它改变了它们 '\ n' (这是通用新线支持,默认启用),也就是说只有 '\ n' 在链子里  即使有 '\ r \ N' 在文件中。

如果文件来自Macintosh源,则它仅包含CR = '\ r' 治疗前的新线,但他们将改为 '\ n' 要么 '\ r \ N' (根据平台)在非Macintosh机器上重写期间。

如果它是来自Linux源的文件,则它仅包含LF = '\ n' 在Windows操作系统上将更改为的换行符 '\ r \ N' (我不知道在Macintosh上处理的Linux文件)。 原因是操作系统Windows写道 '\ r \ N' 无论订购什么, '\ n' 要么 '\ r' 要么 '\ r \ N'。因此,将会有比读取更多的字符重写,然后是文件指针之间的偏移  和 背部 会减少并造成混乱的重写。

在HTML源代码中,还有各种换行符。

这就是为什么在处理它们时以二进制模式打开文件总是更好的原因。


3
2018-02-02 16:59



谢谢,我的系统是Linux和Win - Merlin


替代版本

您可以直接使用该命令 read() 如果你知道角色的位置 pos 分离(标题部分与感兴趣的部分)换行,例如,一个 \n,在要断开输入文本的文本中:

with open('input.txt', 'r') as txt_in:
    txt_in.seek(pos)
    second_half = txt_in.read()

如果您对这两个半部分感兴趣,您还可以调查以下方法:

with open('input.txt', 'r') as txt_in:
    all_contents = txt_in.read()
first_half = all_contents[:pos]
second_half = all_contents[pos:]

1
2017-10-26 12:38





您可以将整个文件读入数组/列表,然后从适合您希望开始读取的行的索引处开始。

f = open('dwn.txt', 'rb')
fileAsList = f.readlines()
fileAsList[0] #first line
fileAsList[1] #second line

0
2018-02-01 15:31



-1(1)文本文件中的'rb'(2)readlines() - John Machin


#!/usr/bin/python

with open('dnw.txt', 'r') as f:
    lines_7_through_end = f.readlines()[6:]

print "Lines 7+:"
i = 7;
for line in lines_7_through_end:
    print "    Line %s: %s" % (i, line)
    i+=1

打印:

第7行:

  Line 7: 201102 foo bar 200 50

  Line 8: 201101 foo bar 300 35

编辑:

要重建 dwn.txt 如果没有前六行,请在上面的代码后执行此操作:

with open('dnw.txt', 'w') as f:
    for line in lines_7_through_end:
        f.write(line)

0
2018-02-01 15:39



使用with:open('dnw.txt','r')为f:lines = f.readlines()[6:]为行中的行:print“%s”%(line) - Merlin
这就是如何最好地解决SO的问题。 - SilentGhost
@SG它的额外信息会使数据库混乱。 - Merlin
从Python 2.6开始,可能比使用专用索引更优雅: for (i, line) in enumerate(lines_7_through_end, 7):... 这避免了照顾增量 i。 - Emmanuel
没有必要打印 7号线,8号线 我的想法是 - systempuntoout


Python 3:

with open("file.txt","r") as f:
    for i in range(6):
        f.readline()
    for line in f:
        # process lines 7-end

0
2017-08-29 17:51





只做f.readline()六次。忽略返回的值。


-1
2018-02-01 15:26



你自己尝试过吗?如何在一个疯狂的地球上这个答案可能有两个赞成?是否有一些邪恶的黑客入侵者或某事? - SilentGhost
我相信你的意思 f.next(), 那里... - Joe Kington
我的意思是f.readline()。 .next()虽然更好。你们赢了我输了。 - Spacedman
虽然如果你.next()然后尝试.readline()获得一个ValueError来混合迭代和读取方法。 - Spacedman
由于有正当理由,您已经对'readlines()'解决方案进行了低估,但是为什么要使用readline()[次6]解决方案?当然这不会读取整个文件。还要注意我的问题.next()然后是.readline()。 - Spacedman


解决方案 readlines方法() 在我看来并不令人满意,因为 readlines方法() 读取整个文件。用户将不得不再次读取行(在文件中或在生成的列表中)来处理他想要的内容,而它可以在没有第一次读取有趣行的情况下完成。此外,如果文件很大,则内存由文件的内容加权,而a for line in file教学会更轻松。

重复readline()就可以这样做

nb = 6
exec( nb * 'f.readline()\n')

这是一段很短的代码和 NB 是可编程调整的


-1
2018-02-01 17:42



你是认真的吗? exec。平心而论! - SilentGhost
+1表示不将整个文件读入内存,-100表示​​使用 exec - John Machin
有什么反对exec()?它仍然在Python 3中;如果它和xreadlines()一样糟糕,它就会被弃用。我从不使用exec(),在我看来,在这种情况下,它可以缩短代码而不是用readline()写6行 - eyquem
«readlines()的解决方案在我看来并不令人满意,因为readlines()读取整个文件。 »嗯,可以讨论。这取决于文件和目标。如果文件很大并且只有几行很有趣,那么在重新阅读之前阅读整个文件并不是一个好主意。但是如果不是很大并且列表中的所有行简化了代码或其他任何内容,那么它是可以接受的。这取决于。我不再同意自己。 - eyquem