【问题标题】:Keys of a dictionary of lists to a row-enumerated, tab-delimited csv file列表字典的键到行枚举、制表符分隔的 csv 文件
【发布时间】:2019-02-21 09:29:06
【问题描述】:

包含字符名称及其偏移量的字典如下所示:

{'Amestris': [(2247, 2255)],
     'Beda': [(3266, 3270)],
     'Fuery': [(2285, 2290),
               (2380, 2385),
               (2686, 2691),
               (2723, 2728),
     'Gloria': [(1565, 1571)],
     'Hawkeye': [(22, 29),
                 (832, 839),
                 (999, 1006),
                 (1119, 1126),
                 (1927, 1934),
                 (3007, 3014),
                 (4068, 4075)]}

我想要的输出是字典的键(字符名称)。

另外,第一列应该枚举字符名称作为它们的ID,从0开始。

制表符分隔的 csv 文件应如下所示:

Id  Label
0  Amestris
1  Beda
2  Fuery
3  Gloria
4  Hawkeye

到目前为止,我已经达到了这一点:

import csv
import pickle

exmen = pickle.load(open("exmen.p", "rb"))

with open('mycsvfile.csv', 'w') as f:
    i = 0
    fieldnames = ['Id', 'Label']
    w = csv.writer(f, delimiter=' ', fieldnames=fieldnames)
    w.writeheader()
    w.writerow(i(dict(fieldnames, (key))) for key in exmen)

我收到此错误消息:

line 28, in <module>
    w = csv.writer(f, delimiter=' ', fieldnames=fieldnames)

TypeError: 'fieldnames' is an invalid keyword argument for this function

我不知道如何包含标题 IdLabel 而不是使用 fieldnames 以及如何实现行的枚举,这里我尝试应用 i = 0 并试图找到某个地方最后一行应用i += 1,但它给了我错误警告syntax error

有什么改进代码的想法吗?

提前致谢!

【问题讨论】:

  • csv.DictWriter() 而不是 csv.writer
  • @Rakesh 当我这样做时,我得到了错误:AttributeError: 'generator' object has no attribute 'keys'

标签: python csv dictionary key enumerate


【解决方案1】:

fieldnames 只是csv.DictWriter 的一个参数,您在这里不需要。你可以试试看。使用csv.writer

with open('mycsvfile.csv', 'w') as f:
    w = csv.writer(f, delimiter='\t')  # tab delimited
    w.writerow(['Id', 'Label'])        # just write header row
    w.writerows(enumerate(exmen))      # write (id, key) rows

如果exmen 是常见的dict,则无法保证键的顺序。你可以这样做:

    w.writerows(enumerate(sorted(exmen)))

强制执行字母顺序。

【讨论】:

  • 这很好用!但是我得到的文件在实际结果之间有空行。有没有办法避免这种情况? PS:VfB ein Leben lang!
  • 它不应该有空行。你还有其他代码在运行吗? PS:1893嘿嘿!
  • 不是真的,我上面问题中的代码正是我的代码文件所拥有的。这很奇怪......就像它跳过一行然后每次都打印结果。
  • 啊,我在这里搜索了一下,发现在'w'之后添加newline=''可以解决。谢谢! weiß-rote Grüße aus Stuttgart.
  • 这仍然很奇怪。会不会是您的某些密钥以\n 结尾。
猜你喜欢
  • 2013-01-21
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 2015-07-25
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多