循环列表列表并保存不同的文件

Posted

技术标签:

【中文标题】循环列表列表并保存不同的文件【英文标题】:Looping over a list of lists and saving different files 【发布时间】:2015-04-12 12:20:07 【问题描述】:

我在 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

任何提示我可以做些什么来解决它?

【问题讨论】:

在第二行,你应该把它改成 textblock[n] 的长度。 【参考方案1】:

如果您使用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 将在您遍历列表时为您提供索引和项目。

【讨论】:

但是如果我这样做......我的文件名变成了我元素的内容,因此显然太长了。我想在里面有一个简单的数字【参考方案2】:

您可以使用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]

【讨论】:

【参考方案3】:

让我们澄清一下您的数据结构。听起来是这样的:

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))

【讨论】:

ffile.write(inner_list) 不起作用 - write() 需要一个字符串,而不是一个列表。如果原始字符串由新行终止(或者您不关心输出文件中有新行),您可以改用 writelines()。否则,您将需要遍历每个子列表中的行并使用新行输出该行,例如ffile.write('\n'.format(line)).【参考方案4】:

如果您想编写列表列表,请使用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:利用for循环比较两个列表元素的异同进而找出共有元素各自不同元素并全部导出到csv文件实现代码

如何保存来自 python 循环的不同名称的多个绘图? [复制]

R-如何在列表上循环并输出不同的数据帧

在Python中解析多个xml文件

For循环将列表的所有元素放入不同的文本文件中,而不是在python中遍历每个元素

将带有列表文件的数组传递给 curl 循环