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

时间:2015-05-14 11:22:42

标签: python list csv dictionary

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

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()需要一系列字符串,所以不太确定缺少什么。

根据我在其他地方读到的内容,代码打开("字母{}。csv" .format(键)," w")应该为每个密钥创建一个唯一的文件,后续行应指示将列表写入相应的文件。

5 个答案:

答案 0 :(得分:2)

普通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

答案 1 :(得分:1)

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

您需要将字符串与\t结合使用,然后再将其传递给writelines

答案 2 :(得分:1)

io.IOBase.writelines

  

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

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

答案 3 :(得分:0)

尝试:

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

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

答案 4 :(得分:-1)

错误消息告诉您它不接受关键字参数,因此如果您转到writelines()来电,第一个问题是您在向其传递关键字参数时不能接受它。明确地:f.writelines(lists, 分隔符=' \ 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