遍历列表列表并保存不同的文件
Looping over a list of lists and saving different files
我在 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
有什么提示可以解决吗?
如果您使用 for n in textblock:
遍历 textblock
,那么 n
将获取 textblock
中每个项目的值(因此 n
是list
)。然后,如果您尝试获取 textblock[n]
,那么您将尝试使用列表 n
作为索引。
你可以只拥有:
for x in textblock:
for line in x:
# do stuff with the line
不要尝试关闭 ffile
-- 它会被 with
块自动关闭。
如果你想在文件名中使用索引,我想你想要的是这样的:
for i, lines in enumerate(textblock):
with open('file_{0}.dat'.format(i),'w') as ffile:
for line in lines:
ffile.write(line)
enumerate
将在您遍历列表时为您提供索引和项目。
您可以使用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]
在每个 iteration
中给出 1,2,3
。不需要 [1,2,3][i]
让我们澄清一下您的数据结构。听起来像这样:
outer_list = [ ["STRING1", "STRING2", ...],
["STRING1", "STRING2", ...],
["STRING1", "STRING2", ...],
["STRING1", "STRING2", ...]
]
所以让我们使用python的可迭代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))
如果您想编写列表的列表,请使用 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)
我在 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
有什么提示可以解决吗?
如果您使用 for n in textblock:
遍历 textblock
,那么 n
将获取 textblock
中每个项目的值(因此 n
是list
)。然后,如果您尝试获取 textblock[n]
,那么您将尝试使用列表 n
作为索引。
你可以只拥有:
for x in textblock:
for line in x:
# do stuff with the line
不要尝试关闭 ffile
-- 它会被 with
块自动关闭。
如果你想在文件名中使用索引,我想你想要的是这样的:
for i, lines in enumerate(textblock):
with open('file_{0}.dat'.format(i),'w') as ffile:
for line in lines:
ffile.write(line)
enumerate
将在您遍历列表时为您提供索引和项目。
您可以使用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]
在每个iteration
中给出1,2,3
。不需要[1,2,3][i]
让我们澄清一下您的数据结构。听起来像这样:
outer_list = [ ["STRING1", "STRING2", ...],
["STRING1", "STRING2", ...],
["STRING1", "STRING2", ...],
["STRING1", "STRING2", ...]
]
所以让我们使用python的可迭代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))
如果您想编写列表的列表,请使用 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)