我正在尝试将列表写入文件。我的代码写入除最后列表之外的所有列表。我不知道为什么。有人可以看看我的代码,让我知道我做错了什么?
complete_test=[['apple','ball'],['test','test1'],['apple','testing']]
counter = 1
for i in complete_test:
r=open("testing"+str(counter)+".txt",'w')
for j in i:
r.write(j+'\n')
counter=counter +1
谢谢。
答案 0 :(得分:9)
您需要致电words="'hello world' how are you"
IFS=$'\n' read -d '' -ra array < <(xargs -n 1 printf '%s\n' <<<"$words")
declare -p array
。
如果您将代码作为Python文件运行,则不会发生这种情况,但它在解释器中可以重现,并且出现这种情况:
对文件的所有更改都是缓冲的,而不是立即执行。当不再有任何对它们的有效引用时,CPython将关闭文件,例如在循环的每次迭代中覆盖引用它们的唯一变量时。 (当它们关闭时,所有缓冲的更改都会被刷新写出来。)在最后一次迭代中,您永远不会关闭文件,因为变量r.close()
会粘在一起。您可以验证这一点,因为在解释器中调用r
会关闭文件并导致更改。
这是上下文管理器和exit()
语句的一个激励示例,如在inspectorG4dget的答案中。他们为您处理文件的打开和关闭。使用该代码,而不是实际上调用with
,并了解这就是你正在做的事情。
答案 1 :(得分:4)
这是一种更清洁的做同样事情的方式:
complete_test=[['apple','ball'],['test','test1'],['apple','testing']]
for i,sub in enumerate(complete_list, 1): # `enumerate` gives the index of each element in the list as well
with open("testing{}".format(i), 'w') as outfile: # no need to worry about opening and closing, if you use `with`
outfile.write('\n'.join(sub)) # no need to write in a loop
outfile.write('\n')