我有一个包含列表的字典;键基于每个列表中的第一项。使用有趣的随机数据集,字典构建如下:
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")应该为每个密钥创建一个唯一的文件,后续行应指示将列表写入相应的文件。
答案 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)
将一个行列表写入流中。不添加行分隔符,因此通常每个提供的行在末尾都有行分隔符。
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)