如何将列表元素写入制表符分隔文件?

时间:2018-05-24 17:24:47

标签: python list file tab-delimited

我在网上搜索过,但我找不到问题的答案:

我有一个以列表作为元素的字典,每个列表都有不同的长度。例如:

dict_with_lists[value1] = [word1, word2, word3, word4]
dict_with_lists[value2] = [word1, word2, word3]

我的主要问题是,我想将列表元素写入一个应该以制表符分隔的文件中,如果列表已完成,则应将新列表写入新行。

我找到了类似的解决方案:

with open('fname', 'w') as file:
   file.writelines('\t'.join(i) + '\n' for i in nested_list)

但它不仅将单词与制表符分开,还将字符分开。

4 个答案:

答案 0 :(得分:1)

我认为您正在对字典内的列表进行列表理解。另一种解决方案是

with open('fname', 'w') as file:
    for nested_list in dict_with_lists.values():
        for word in nested_list:
             file.write(word + '\t')
         file.write('\n')

\我只是循环遍历字典的值,在这种情况下是列表,并使用制表符连接它们并在每个列表的末尾写一个换行符。我还没有对它进行过测试,但理论上我认为它应该可行。

答案 1 :(得分:0)

如果nested_list是您的某个字典值,那么您将'\t'.join()应用于单个字词。您想要加入整个列表

file.write('\t'.join(nested_list) + '\n')

或者,如果你要遍历字典的值:

file.writelines(
    '\t'.join(nested_list) + '\n'
    for nested_list in dict_with_lists.values())

以上正确使用file.writelines() method;传入一个可迭代的字符串来写。如果你传入一个字符串,那么你只会导致Python额外的工作,因为它循环遍历该字符串的所有单个字符以单独写入,之后底层缓冲区必须再将它们组装回更大的字符串。 / p>

但是,这里没有必要重新发明字符分隔值写入轮。使用csv module,将分隔符设置为'\t'

import csv

with open('fname', 'w', newline='') as file:
    writer = csv.writer(file, delimiter='\t')
    writer.writerows(dict_with_lists.values())

上面将dict_with_lists词典中的所有列表写入文件。如果您的列表长度不同,csv.writer()对象并不介意。

答案 2 :(得分:0)

您需要将字典中的每个list值转换为一系列制表符分隔值,这些值在每个值的末尾都有一个'\n'换行符:

value1, value2 = 'key1', 'key2'
dict_with_lists = {}
dict_with_lists[value1] = ['word1', 'word2', 'word3', 'word4']
dict_with_lists[value2] = ['word1', 'word2', 'word3']

fname = 'dict_list_values.tsv'

with open(fname, 'w') as file:
    file.writelines(
        '\t'.join(values)+'\n' for values in dict_with_lists.values()
    )

答案 3 :(得分:-1)

我不打算回答您的问题,而是要提示您如何解决实际问题。

还有另一种存储数据的方法(非表格形式的字典),它是以JSON字符串格式保存的。

import json
with open('fname','w') as f:
    json.dump(dict_with_lists, f)

然后加载它的代码将是:

import json
with open('fname') as f:
    dict_with_lists = json.load(f)