遍历列表列表并保存不同的文件

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 中每个项目的值(因此 nlist)。然后,如果您尝试获取 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_listouter_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)