首页 文章

列表字典:将列表(带有制表符分隔项)写入每个键的不同文件(Python)

提问于
浏览
4

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

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() takes no keyword arguments" . 我已经做了一些阅读,我知道writelines()需要一系列字符串,所以不太确定缺少什么 .

基于我在别处读到的内容,代码 open("letter{}.csv".format(key), "w") 应为每个键创建一个唯一的文件,后续行应指示将列表写入相应的文件 .

5 回答

  • -1

    io.IOBase.writelines

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

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

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

    在将字符串传递给 writelines 之前,需要将字符串与 \t 连接在一起 .

  • 0

    错误消息告诉您它不接受关键字参数,因此如果您跳转到 writelines() 调用,第一个问题是您're passing it a keyword param when it can' t接受它 . 具体来说: 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

  • 1

    尝试:

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

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

  • 1

    正常 file.write 没有关键字args,你可能会混淆,应该使用csv module,它确实采用 delimiter 参数,迭代 d.items ,将 k 键传递给 str.format ,列表列表传递给 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)
    

    LetterA.csv:

    A   bb  cc
    A   ff  gg
    

    LetterB.csv:

    B   dd  ee
    B   hh  ii
    

相关问题