我是一名新手,也是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
答案 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行,并将从该点到文件末尾的行写入输出