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

问题描述 投票:14回答:10

我有一个文本文件结构:

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?

python file-io
10个回答
28
投票
with open('dwn.txt') as f:
    for i in xrange(6):
        f.next()
    for line in f:
        process(line)

-1
投票

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

重复readline()可以这样做

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

它是一小段代码,nb是可编程调整的


6
投票

Itertools回答!

from itertools import islice

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

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

3
投票

事实上,要正确回答问题,因为它是写的

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()

truncate()函数对于放置您要求的EOF至关重要。在不执行truncate()的情况下,文件的尾部(对应于6行的偏移量)将保留。

.

必须以二进制模式打开该文件以防止出现任何问题。

当Python读取'\ r \ n'时,它会在'\ n'(即默认启用的通用换行支持)中对它们进行转换,也就是说,即使存在'链中的块,也只有'\ n' \ r \ n'在文件中。

如果文件来自Macintosh原点,它在处理之前只包含CR ='\ r'换行符,但在非重写期间它们将被更改为'\ n'或'\ r \ n'(根据平台) - 麦金托什机器。

如果它是来自Linux源的文件,它只包含LF ='\ n'换行符,在Windows操作系统上,它们将更改为'\ r \ n'(我不知道在Macintosh上处理的Linux文件)。原因是操作系统Windows写入'\ r \ n'无论订购什么,'\ n'或'\ r'或'\ r \ n'。因此,重写的字符数将比读取的数量多,然后前后文件指针之间的偏移量将减小并导致混乱的重写。

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

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


3
投票

Python 3:

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

1
投票

Alternative version

如果你知道分离的字符位置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:]

0
投票

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

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

0
投票
#!/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)

-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.