Python 读/写一个文件,其中每一行都是dict的列表

Python 读/写一个文件,其中每一行都是dict的列表,python,dictionary,io,Python,Dictionary,Io,我想基本上做到这一点: f = open(genes_path, 'w') for key, genes in key_genes.iteritems(): f.write(key) for gene in genes: f.write(",\t"+gene) f.write("\n") f.close() 得到这个: 按键1、AT3G32920、AT3G33187、AT3G32940、AT3G32930、AT3G32980

我想基本上做到这一点:

  f = open(genes_path, 'w')
  for key, genes in key_genes.iteritems():
      f.write(key)
      for gene in genes:
          f.write(",\t"+gene)
      f.write("\n")

  f.close()
得到这个:

按键1、AT3G32920、AT3G33187、AT3G32940、AT3G32930、AT3G32980、AT3G32960

按键2,AT3G32920,AT3G33187,AT3G32940,AT3G32930

如果键可以是任何字符串(不带逗号),则顺序在任何地方都无关紧要(为了方便打印,我使用OrderedMultiDict from和List,但实际上并不重要,可以是dict并设置为我所关心的),并且每行可以有不同数量的元素

我似乎找不到任何模块来完成这个相当简单的任务。DictWriter需要列/字段名,因此无法回答我的问题。Numpy只适用于矩形数组,填充会引入太多不必要的内容。我知道自己编写循环很容易,但我只是觉得这很普通,它有自己的内置

有时候,我只需要给人们发送一大堆东西(比如基因给不编程的人),这样他们就可以把它拉到excel中,添加或删除元素,然后再发回,我不需要做任何其他事情

有谁知道有一个模块具有自动读取和写入这些不规则的目录文件的功能?或者如果有一个很好的理由不存在

我在想一些非常简单的事情,比如
pandas.read_csv(path,delimiter=“,”)
pandas.DataFrame.to_csv(path,delimiter=“,”)


基本原理


我之所以挑剔它是一个模块的单个函数,而不是我在纯python中很容易做到的事情,并不是因为我很懒,而是因为当你使用一个有好文档的模块中的东西时,人们更容易查看代码并弄清楚它的意图。即使任务有点琐碎,您仍然在降低代码的复杂性。我认为编写自己的函数是特定于域的,而公共读写例程应该是您导入的,如果可用,最好使用。是python禅宗的一部分吧?因此,第二个问题实际上是问“这是一项特定于领域的任务吗?”,因为在我看来并非如此

您可以将每一行构建成一个字符串,然后执行一次写入操作:

with open(genes_path, 'w') as f:
    for key, genes in key_genes.iteritems():
        f.write("\n".join(",\t".join([key] + genes)))

这仍然是你自己做的,但它比你发布的代码更简洁。

首先,我不知道你原来的循环有什么不好的地方(你可以把它变成一个函数,并使用。但是,我提到了
csv
模块,因为它似乎几乎完全符合您的要求,不需要
DictWriter

我假设你是这样开始的:

In [4]: key_genes
Out[4]: 
{'key1': ['AT3G32920',
  'AT3G33187',
  'AT3G32940',
  'AT3G32930',
  'AT3G32980',
  'AT3G32960'],
 'key2': ['AT3G32920', 'AT3G33187', 'AT3G32940', 'AT3G32930'],
 'key3': ['AT3G32920',
  'AT3G33187',
  'AT3G32940',
  'AT3G32930',
  'AT3G32980',
  'AT3G32960'],
 'key4': ['AT3G32920', 'AT3G33187', 'AT3G32940', 'AT3G32930']}
所以这个代码:

with open('out.csv', 'wb') as outfile:
    writer = csv.writer(outfile)
    for key, genes in key_genes.iteritems():
        writer.writerow([key] + genes)
产生以下结果:

key3,AT3G32920,AT3G33187,AT3G32940,AT3G32930,AT3G32980,AT3G32960
key2,AT3G32920,AT3G33187,AT3G32940,AT3G32930
key1,AT3G32920,AT3G33187,AT3G32940,AT3G32930,AT3G32980,AT3G32960
key4,AT3G32920,AT3G33187,AT3G32940,AT3G32930
显然,如果你想对键进行排序,你可以这样做,你的键将被排序,因为你使用的是有序结构,而我使用的是一个常规的内置dict。现在我们进入了你的需求的几乎部分。您正在使用
,\t
作为分隔符。如果您尝试使用
csv.writer
执行此操作,它会抱怨分隔符应该是一个字符。这对我来说很有意义,因为csv文件通常以逗号分隔或制表符分隔,而不是两者都以逗号分隔。分隔符只是为了便于机器处理而存在,机器只需要一个字符(在其他任何地方都不会出现无引号的字符)


因此,我的最终答案是:如果您可以使用一个字符分隔符(对于正常的CSV处理,这应该不是问题),请使用
CSV
模块。否则,请使用短循环。

您是否尝试过使用?这可能很有用:@Two Bitalchest这就是DictWriter的来源是的。@sodiumnitrate我不想显式地写入excel格式,我想要csv/文本,因为这是通用的。我的意思是,那么您所做的应该会起作用。我会用Jake Griffin下面的答案或你的代码编写一个函数来进行打印,并在需要打印时调用它。我想它也会有一个很好的加速。这也很好,但正如你所说的,就冗长而言,这并不是一个很大的改进。分隔符并不重要。我将在问题中加入我想法的函数签名。