文件是
迭代器
是的。循环读取文件。
直到你走到尽头
是的。当你试图阅读更多的东西时,他们不会回到开始。一个新的
for
循环文件对象不会“重置”文件。
在循环中每次重新打开输入文件,显式地返回到起始位置,或者只读取一次该文件。你可以找回来
src_f.seek(0)
,重新打开意味着您需要使用两个
with
语句(一个打开输出文件一次,另一个在
对于
循环以处理
src_f
源文件)。
在这种情况下,假设您一次就建立了要写入内存的数据,我只读取一次输入文件,只保留需要复制的行。
您可以使用多个
对于
在同一个文件对象上循环,文件位置将相应更改。这使得从一个键字符串的匹配到另一个键字符串的一系列行的读取变得非常简单。这个
itertools.takewhile()
function
更容易:
from itertools import takewhile
# read the correct lines (from SPI_frame_0 to halt) from the source file
lines = []
with open(src_file, "r") as src_f:
for line in src_f:
if r"SPI_frame_0" in line:
lines.append(line)
# read additional lines until we find 'halt'
lines += takewhile(lambda l: 'halt' not in l, src_f)
# transform the source lines with a new counter
with open(dst_file, "a") as dst_f:
for cnt, hex_num in enumerate(hex_data):
copy_mid_data = []
for line in lines:
if "SPI_frame_0" in line:
line = line.replace('SPI_frame_0', 'SPI_frame_{}'.format(cnt))
copy_mid_data.append(line)
updated_data = WriteHexData(''.join(copy_mid_data), hex_num, cnt, msb_lsb_flag)
dst_f.write(updated_data)
注意我变了
copy_mid_data
以避免二次字符串复制;只连接一次字符串列表要有效得多。