【问题标题】:How to write list elements into a tab-separated file?如何将列表元素写入制表符分隔的文件?
【发布时间】:2018-11-04 00:19:30
【问题描述】:

我已经搜索了网络,但我没有找到我的问题的答案:

我有一本以列表为元素的字典,每个列表都有不同的长度。比如这样:

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)

但它不仅用制表符分隔单词,而且还分隔字符。

【问题讨论】:

  • dict_with_listsnested_list 有什么关系?
  • 另外,这些字典值应该按什么顺序来写?密钥是否涉及任何地方?
  • “但它不仅用制表符分隔单词,还分隔字符” 这句话非常简洁。请重写这个。此外,上面file.writelines 的问题是i 必然是您的字典的键,而不是列表。

标签: python list file csv


【解决方案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')

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

【讨论】:

  • 嗯,除非列表的顺序是问题,否则它应该可以工作
  • 同意,但我不认为他将订单列为问题,所以我只是采用了最直接的方式,这也与他已有的方式相似。
  • 没问题,我很高兴能帮上忙! :)
  • 我刚读到订单不包含,可以保留吗?另外我注意到我需要将每个列表的值也添加到行的开头,我应该如何更改代码以使其也适用于这种情况?该值是(v1,v2,v3)的三倍。对不起,我没有早点澄清! @王
  • 成功了,再次感谢! :D 但现在我不知道如何访问字典的值,我自己尝试了一些选项,但没有奏效......再次抱歉另一个问题!
【解决方案2】:

您需要将字典中的每个 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】:

    如果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 额外的工作,因为它会遍历该字符串的所有单个字符以分别写入这些字符,之后底层缓冲区必须再次将它们组合回更大的字符串。

    但是,这里没有必要重新发明字符分隔值写入轮。使用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() 对象不介意您的列表是否具有不同的长度。

    【讨论】:

      【解决方案4】:

      我不会直接回答你的问题,而是给你一个提示,告诉你如何解决你的实际问题。

      还有另一种存储类似数据的方法(非表格形式的字典),它是将其保存为 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)
      

      【讨论】:

      • 当然,但不清楚 OP 是否希望保留整个字典。
      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 2016-01-02
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 2021-09-28
      • 2013-03-09
      • 1970-01-01
      相关资源
      最近更新 更多