Python 从给定行和列号复制输入文件
我是一个新手,对Python编程非常陌生。我一直在为我的工作开发一个Python程序(旧版本2.5.2)。它应该通过两个测试条件来找到所需数据的开始。下面的代码确实适用于此 然后它应该写一个包含测试发现的信息的文件,从第10位的第nr行开始,一直到/eof标记。毫无疑问,下面的代码有些不完整,但说明了我试图遵循的路线 当我尝试使用我所遵循的方法时,我一直得到一个“值错误:混合迭代和读取方法会丢失数据”。我不完全理解到底是什么导致了这个错误的发生。如有任何意见或建议,将不胜感激。顺便说一句,我不能在下一个()中使用想法。谢谢Python 从给定行和列号复制输入文件,python,Python,我是一个新手,对Python编程非常陌生。我一直在为我的工作开发一个Python程序(旧版本2.5.2)。它应该通过两个测试条件来找到所需数据的开始。下面的代码确实适用于此 然后它应该写一个包含测试发现的信息的文件,从第10位的第nr行开始,一直到/eof标记。毫无疑问,下面的代码有些不完整,但说明了我试图遵循的路线 当我尝试使用我所遵循的方法时,我一直得到一个“值错误:混合迭代和读取方法会丢失数据”。我不完全理解到底是什么导致了这个错误的发生。如有任何意见或建议,将不胜感激。顺便说一句,我不能
问题可能是因为您正在使用
对于nr,枚举(f)中的行:
和行=f.readlines()
同时进行
实际上,当您在for循环中使用枚举时:=>
对于nr,枚举(f)中的行:
然后您已经从变量行中的文件中读取了一行,然后再次读取变量行中循环中的文件
=>lines=f.readlines()
这可能会导致数据丢失,因为您正在更改文件指针的位置f
在下一次迭代中,它将不会出现在预期的位置。(最有可能是前面一行)
因此,要么删除这一行[lines=f.readlines()
],要么执行以下操作:
这是因为您在文件上循环使用enumerate(f)
中的行作为nr,然后在其中得到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行,并将从该点到文件末尾的行写入输出完全回溯后,您也正在将previous
初始化为None
,然后尝试将其切片previous[0:7]
@kroolik实际上它是无
,OP已将其初始化为'
。。。奇怪。。。但是…对不起,我没注意到!第一次看到有人定义一个none
变量。回溯:File“p9.py,行中15行=f.readlines()#读取文件中的everthin并将其存储在列表中。ValueError:混合迭代和读取方法将丢失数据。@user2994541您可以将您的问题包含在信息中。我将检查此方法。很抱歉,我不清楚,但我声明数据从第nr行的第10位开始,然后从第10位开始。@user2994541所以,ar你是说你可以跳过前9行吗?如果是的话,我不明白为什么要额外检查?
while True:
line=f.readline()
if not line:
break
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()