我在python中有一个包含4个元素的列表,这些元素本身就是行列表(文本)
我想将这些元素保存在带编号的文件名中。
for n in textblock:
for line in textblock[n]:
with open('file_{0}.dat'.format(n),'w') as ffile:
ffile.write(textblock[n[line]])
ffile.close()
我收到错误消息:
for line in textblock[n]:
TypeError: list indices must be integers, not list
任何暗示我可以做些什么来解决它?
答案 0 :(得分:1)
如果您使用textblock
迭代for n in textblock:
,那么n
将获取textblock
中每个项目的值(因此n
是{ {1}})。然后,如果您尝试获取list
,那么您尝试使用列表textblock[n]
作为索引。
你可以拥有:
n
请勿尝试关闭for x in textblock:
for line in x:
# do stuff with the line
- 它会被ffile
阻止自动关闭。
如果你想在文件名中使用索引,我认为你想要的是这样的:
with
enumerate
会在您遍历列表时为您提供索引和项目。
答案 1 :(得分:1)
您可以使用enumerate
for n,m in enumerate(textblock, 1):
with open('file_{0}.dat'.format(n),'w') as ffile:
for line in m:
ffile.write(line)
注意强>
with open
将负责close()
。for i in [1,2,3]
在每个1,2,3
中提供iteration
。无需[1,2,3][i]
答案 2 :(得分:1)
让我们澄清您的数据结构。听起来像这样:
outer_list = [ ["STRING1", "STRING2", ...],
["STRING1", "STRING2", ...],
["STRING1", "STRING2", ...],
["STRING1", "STRING2", ...]
]
因此,让我们使用python的iterable for循环结构来遍历外部列表。
for inner_list in outer_list:
但我们希望使用inner_list
中inner_list
的位置将每个outer_list
的内容写入文件。让我们使用内置的enumerate()
函数来获取位置。
for n, inner_list in enumerate(outer_list, 1):
# write inner list to file
让我们检查一下将inner_list
写入文件。
with open('file_{0}.dat'.format(n),'w') as ffile: # this is fine, well done.
ffile.write(inner_list)
所有这些将是:
for n, inner_list in enumerate(outer_list, 1):
with open('file_{0}.dat'.format(n),'w') as ffile:
ffile.write(inner_list)
# no need to close the file, the with syntax does this for you.
编辑:正如@mhawke所指出的那样,这里还需要一个步骤
write()
方法要求传递一个字符串。我们可以很容易地将inner_list转换为字符串。我首选的方法是使用join()
方法。我们可以指定我们将inner_list
中的每个字符串与一个新行字符连接起来,以便它可以很好地打印,即
'\n'.join(inner_list)
因此我们的最终解决方案是:
for n, inner_list in enumerate(outer_list, 1):
with open('file_{0}.dat'.format(n),'w') as ffile:
ffile.write('\n'.join(inner_list))
答案 3 :(得分:0)
如果要编写列表列表,请使用csv模块:
import csv
for ind, lsts in enumerate(textblock):
with open('file_{0}.dat'.format(ind),'w') as ffile:
wr = csv.writer(file)
wr.writerows(lsts)