【问题标题】: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] 的长度。

标签: python list save


【解决方案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)    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多