【问题标题】:Dictionary of lists: writing lists (with tab separated items) to different files for each key (Python)列表字典:将列表(使用制表符分隔的项目)写入每个键的不同文件(Python)
【发布时间】:2015-07-25 23:56:19
【问题描述】:

我有一本包含列表的字典;键基于每个列表中的第一项。使用有趣的随机数据集,构建字典如下:

import collections

rand_ls = [["A","bb","cc"],["B","dd","ee"],["A","ff","gg"],["B","hh","ii"]]
d = collections.defaultdict(list)

for item in rand_ls:
    d[item[0]].append(item)

print(dict(d))
    # {'A': [['A', 'bb', 'cc'], ['A', 'ff', 'gg']], 'B': [['B', 'dd', 'ee'], ['B', 'hh', 'ii']]}

我想将每个键中保存的列表写入单独的 .csv 文件,每个键一个。我找到的最接近的解决方案是详细的here,但我无法让它工作。我追求的格式:

letterA.csv
    A    bb    cc
    A    ff    gg

letterB.csv
    B    dd    ee
    B    hh    ii

注意:letter{}.csv 是每个键的唯一文件;每个列表(在每个键中)都位于单独的行中,并且列表中的每个项目都由制表符分隔。

我的代码是这样的:

for key,lists in d.items():
    with open("letter{}.csv".format(key), "w") as f:
       f.writelines(lists, delimiter='\t')

它不断抛出错误:“TypeError: writelines() 没有关键字参数”。我做了一些阅读,我知道 writelines() 需要一个字符串序列,所以不太确定缺少什么。

根据我在其他地方读到的内容,代码 open("letter{}.csv".format(key), "w") 应该为每个键创建一个唯一的文件,并且后续行应将列表写入适当的文件。

【问题讨论】:

  • 我猜writelines() 方法期待的是字符串而不是列表,为了将列表转换为字符串,您可以使用"\t".join(lst)

标签: python list csv dictionary


【解决方案1】:

阅读您收到的错误:writelines() takes no keyword arguments。您在对writelines 的调用中看到关键字参数了吗?

您需要将您的字符串与\t 连接在一起,然后再将它们传递给writelines

【讨论】:

    【解决方案2】:

    试试:

    for key,lists in d.items():
        with open("letter{}.csv".format(key), "w") as f:
           f.write('\t'.join(lists))
    

    正如您收到的错误消息所示,writelines 不接受关键字参数(例如 delimiter)。由于您不是将列表写入文件,而是从由制表符连接的列表创建的字符串,因此您甚至不需要writelines

    【讨论】:

      【解决方案3】:

      错误消息告诉你它不接受关键字参数,所以如果你跳到你的writelines() 调用,第一个问题是当它不能接受它时你传递给它一个关键字参数。具体来说:f.writelines(lists,delimiter='\t')

      writelines 将接受要写入文件的字符串列表,但如果你走这条路,你需要自己处理所有格式。如果你想要,我怀疑你想要:

      for key,lists in d.items():
          with open("letter{}.csv".format(key), "w") as f:
             f.writelines('\n'.join(['\t'.join(x) for x in l]))
      

      由于您有一个列表列表,因此内部列表理解只是通过制表符将每个列表中的内容粘合在一起,然后外部循环将所有这些内容与行尾字符粘合在一起。

      但是,仅从模式和问题标签来看 - 您是否考虑过使用 CSV 模块,以及它的关联编写器方法? (https://docs.python.org/2/library/csv.html)

      【讨论】:

      • f.writelines 需要一个行列表。
      • @Sir_FZ f.writelines 期望获得要写入文件的内容列表,它称为“行”。当然,我称它为字符串可能有点花言巧语,但在 OP 的情况下,它是一个制表符分隔、换行符终止的字符串,不是吗?
      • 是的,你是对的,但由于文档声明它接受 list 行,因此为了兼容性,传递列表而不是字符串更有意义.
      • @Sir_FZ 是的,很公平,我不喜欢粗暴地抨击一些东西。我还会传入一个列表,但我也直接使用 CSV 模块,因为它更适合解决问题。
      【解决方案4】:

      普通的file.write 不带关键字args,您可能对此感到困惑,应该使用csv module,它确实带delimiter 参数,遍历d.items,将k 键传递给@ 987654326@ 和列表列表到csv.writer.writerows

      import csv
      
      for k, rows in d.items():
          with open("letter_{}.csv".format(k), "w") as out:
              wr = csv.writer(out,delimiter='\t')
              wr.writerows(rows)
      

      字母A.csv:

      A   bb  cc
      A   ff  gg
      

      字母B.csv:

      B   dd  ee
      B   hh  ii
      

      【讨论】:

      • 干杯@Padraic!发挥魅力。 :D
      • 没有问题。 csv 模块非常适合您想做的事情。
      【解决方案5】:

      io.IOBase.writelines:

      将行列表写入流。不添加行分隔符,因此通常提供的每行末尾都有一个行分隔符。

      f.writelines(["{}\n".format('\t'.join(list_)) for list_ in lists])
      

      【讨论】:

      • 不客气@jat,但请确保您通过接受其中一个答案来结束此问题。
      猜你喜欢
      • 2013-01-21
      • 2019-02-21
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 2019-05-11
      相关资源
      最近更新 更多