【问题标题】:python dictionary to csv filepython字典到csv文件
【发布时间】:2016-01-14 07:37:51
【问题描述】:

我正在将字典的内容写入 csv 文件。我的字典中的 k,v 对是 {int: list of ints}。当它被写入文件时我看到了一件有趣的事情=>当列表的大小为一时,它打印为一个列表。当列表的大小更大时,它会打印为字符串(在双引号中)。这是一个示例输出(如输出 csv 文件中所示):

24,[-12345]
25,[-1962956450172838896]
26,"[-125, -12323459939, -2323445, -345425]"
27,[-730881498578617677]
20,[4001623946089138114]
21,[-12345]

我使用以下代码写入文件:

def dictToCsv(dictionary, csvfile):
    writer = csv.writer(open(csvfile, 'wb'))
    for key, value in dictionary.items():
        writer.writerow([key, value])

我很肯定所有值都是整数列表。

我以这种方式创建字典(为简洁起见,我已缩短代码):

memberList = []
d = {}

with open(inputCsvFile) as f_in:
   for line in f_in:
   pair = line.split(',')
   cid = pair[0]
   member = pair[1]
   value = member.strip()
   memberList.append(int(value))
   d[cid] = memberList

可能出了什么问题?我试图在所有阶段打印 dict 值......它们只是列表。不确定它们是如何转换为字符串的。我只是不希望输出 csvfile 中出现双引号。

感谢任何帮助。

【问题讨论】:

  • 它们都作为列表的字符串表示形式发送到 csv 文件。当列表中有多个项目时,需要在 csv 文件中引用它,以便分隔列表中项目的逗号不会被误认为分隔 csv 文件中字段的逗号。如果您使用 csv 模块将该 csv 文件重新读回 python。您将返回 ["25", "[-1962956450172838896]"] 作为第 2 行的值和 ["26", "[-125, -12323459939, -2323445, -345425]"] 作为第 3 行的值。csv 文件中的唯一类型是字符串。
  • 有不同风格的 csv。正如 Steven 所指出的,由于逗号的歧义,需要引用包含逗号的列表表示。您可以更改为使用分号作为项目分隔符的 csv 风格,或者即使没有必要也使用引号,以获得单项和多项列表的类似输出。详情请看csv模块的python文档,尤其是方言部分:(docs.python.org/3/library/csv.html#csv.Dialect)
  • 如果没有引号,您的 csv 文件将无法工作,并且无法读取...

标签: python csv dictionary


【解决方案1】:

列表作为列表的字符串表示形式发送到 csv 文件。当列表中有多个项目时,需要在 csv 文件中引用它,这样分隔列表中项目的逗号不会被误认为是分隔 csv 文件中字段的逗号。

csv 文件中唯一的数据类型是字符串。如果您使用 csv 模块将该 csv 文件重新读回 python,您将返回 ["25", "[-1962956450172838896]"] 作为第 2 行的值和 ["26", "[-125, -12323459939, -2323445, -345425]"] 作为第 3 行的值。

如果您想避免引用您的列表,您可以通过在创建 csv 文件时设置 delimiter 参数来使用不同的分隔符。制表符分隔 (\t) 在这里可能工作得很好。

【讨论】:

  • 这应该加粗、突出显示和下划线:csv文件中唯一的类型是字符串。
  • 非常感谢您的解释。我已经开始使用制表符分隔符了。
【解决方案2】:

dictToCsv 需要这样修复

def dictToCsv(dictionary, csvfile):
    writer = csv.writer(open(csvfile, 'wb'))
    for key, value in dictionary.items():
       # writer.writerow([key, value]) << wrong
       writer.writerow([key] +  value)

这将生成一个 csv 文件,如下所示:

20,4001623946089138114
21,-12345
24,-12345
25,-1962956450172838896
26,-125,-12323459939,-2323445,-345425
27,-730881498578617677

每行的第一个元素是键,后续元素是关联的列表值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 2016-03-21
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多