我正在尝试重新格式化一些数据并将其保存到python中的输出文件中。我.strip()来自原始的每一行并将其附加到列表中。我创建了第二个列表,其中包含我需要添加到原始数据的值(修改包含原始数据)并迭代它以使用字符串格式化运算符将修改后的数据写入输出文件,当我需要传入一个值时原始数据列表。输出需要在输出的每个记录中插入一次只显示一次的信息,因此它不是1:1的输出(输出行的原始行),这是我遇到的问题。这是我的代码的一个例子......
原始数据:
Client
#ofrecords(as an integer)
Line1ofrecord1
Line2ofrecord1
....
Line1ofrecord2
Line2ofrecord2
....
End
代码:
def shouldbesimple(originalfile):
inputfile = open(originalfile, "r")
outputfile = open('finaloutput.txt', "w")
nowhitespace = originalfile.strip()
Client = nowhitespace.pop(0)
Counter = nowhitespace.pop(0) (each record has exactly the same number of lines)
#at this point only record information remains in list..
Header = "stuff at beginning of each record in output"
Insertclient = "NEEDED {1} CHANGES"
Line1 = "THINGS I {0} MUST ADD"
Footer = "stuff at end of each record in output"
thingstoadd = [Header, Line1, Insertclient, Footer]
while counter > 0 :
writetofile = ""
for element in thingstoadd:
writetofile = element.format(nowhitespace.pop(0), Client)
outputfile.write(writetofile + "\n")
counter = counter - 1
inputfile.close()
outputfile.close()
一切都按预期工作,直到我开始迭代thingstoadd ..
数据没有按预期排列,我收到“从空列表弹出”错误。打印writetofile告诉我python在每次迭代时都在格式语句中运行nowhitespace.pop(0)
操作,而不仅仅是在{0}
出现在相关元素中时。
是否有更合适的方法将原始信息传递到字符串数据中,或者阻止.pop()
操作在每个元素上发生?
答案 0 :(得分:0)
不要试图调试你的代码,而是让我告诉你我是怎么做我认为你想做的事情。
import itertools
# from itertools recipes in the docs
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return itertools.izip_longest(fillvalue=fillvalue, *args)
def shouldbesimple(originalfile):
with open(originalfile) as inputfile, open('finaloutput.txt', "w") as outputfile:
client = next(inputfile).rstrip()
count = int(next(inputfile).rstrip())
groups = grouper(inputfile, 4)
Header = "stuff at beginning of each record in output"
Insertclient = "NEEDED {1} CHANGES"
Line1 = "THINGS I {0} MUST ADD"
Footer = "stuff at end of each record in output"
thingstoadd = [Header, Line1, Insertclient, Footer]
for _ in range(count):
for fmt, line in zip(thingstoadd, next(groups)):
outputfile.write(fmt.format(line.rstrip(), Client) + '\n')
使用此输入:
Client
2
Line1ofrecord1
Line2ofrecord1
Line3ofrecord1
Line4ofrecord1
Line1ofrecord2
Line2ofrecord2
Line3ofrecord2
Line4ofrecord2
End
我得到了这个输出:
THINGS I Line2ofrecord1 MUST ADD
NEEDED Client CHANGES
stuff at end of each record in output
stuff at beginning of each record in output
THINGS I Line2ofrecord2 MUST ADD
NEEDED Client CHANGES
stuff at end of each record in output