从给定的行和列号复制输入文件

时间:2013-11-17 19:45:10

标签: python

我是一名新手,也是Python编程的新手。为了我的工作,我一直在研究Python程序(旧版本2.5.2)。它应该通过两个测试条件来找到所需数据的开头。下面的代码适用于此。

然后它应该写一个文件,其中包含测试找到的信息,从第nr行开始,一直到/ eof标记。毫无疑问,接下来的代码有些不完整,但说明了我试图遵循的路线。

我不断得到一个"值错误:混合迭代和读取方法会丢失数据"当我尝试使用我跟随的方法时。我不完全明白具体导致此错误发生的原因。任何想法或建议将不胜感激。顺便说一句,我不能使用下一个()的合并。感谢。

import sys, os
none = " "
previous = none

sys.argv[1]  
numbers = sys.argv[1]
f = open(numbers,'r')  

for nr, line in enumerate(f):
    if line[:8]=="03 00 01":  ### First test condition
    if previous[0:7] =="/origin" and line[0:8]=="03 00 01":  ### Second test conditions.
        lines = f.readlines()  ### Reads everything in file and store in a list.
        begin_at = 10  ### Begins at 10th position in file line.
        for i in range( begin_at, len(lines) ):
            print lines[i]

    previous = line ### Contents of previous line

2 个答案:

答案 0 :(得分:0)

问题可能是因为您正在使用

for nr, line in enumerate(f):lines = f.readlines()同时进行。

实际上当你在for循环中使用enumerate时:

=> for nr, line in enumerate(f):

然后你已经从变量line中的文件中读取了一行,然后再次在变量lines中读取循环内的文件

=> lines = f.readlines()

这可能会导致您的数据丢失,因为您正在更改filepointer f的位置 并且在下一次迭代中它不会是它应该的位置。(最可能是前面一行)

因此,请删除此行[lines = f.readlines()]或执行以下操作:

while True:
    line=f.readline()
    if not line:
        break

答案 1 :(得分:0)

这是因为你用for nr, line in enumerate(f)循环遍历文件,然后你就有了lines = f.readlines() ......这是另一种方法,它只能在线上迭代,并且不需要将剩余的行加载到内存中。

from itertools import islice, izip, tee, dropwhile

try:
    fin = open('input')
    fout = open('output', 'w')
    fst, snd = tee(fin)
    snd.next()
    dropwhile(lambda L: not (L[0].startswith('/origin') and L[1].startswith('03 00 01')), izip(fst, snd)).next()
    fout.writelines(islice(fin, 10, None))
except StopIteration:
    print "Looks like we didn't find data to use..."
finally:
    fin.close()
    fout.close()

当线条不符合条件时我们跳过文件,然后从那一点开始,我们跳过10行,并将从该点到文件末尾的行写入输出