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

2024-10-02 08:28:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想基本上做到这一点:

  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()

得到这个:

key1, AT3G32920, AT3G33187, AT3G32940, AT3G32930, AT3G32980, AT3G32960

key2, AT3G32920, AT3G33187, AT3G32940, AT3G32930,

其中键可以是任何字符串(没有逗号),顺序在任何地方都不重要(我使用来自boltons的OrderedMultiDict和列表以方便打印,但实际上并不重要,可以是dict并设置为我所关心的),并且每行可以有不同数量的元素。你知道吗

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

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

有没有人知道有一个模块可以自动读写这些杂乱的dict列表文件?或者如果有一个很好的理由让它不存在?你知道吗

我在想一些非常简单的事情,比如pandas.read_csv(path, delimiter=",")pandas.DataFrame.to_csv(path, delimiter=",")。你知道吗


基本原理

我之所以挑剔它是一个模块的单个函数,而不是我在纯python中可以非常容易地做的事情,并不是因为我懒惰,而是因为当你使用一个有良好文档的模块中的东西时,人们会更容易查看代码并准确地了解它的意图。即使任务有点琐碎,您仍然在降低代码的复杂性。我认为编写您自己的函数是特定于域的,而公共读写例程应该是您import需要的,如果可用,最好使用它。是python禅宗的一部分吧?所以第二个问题是“这是一个特定领域的任务吗?”,因为我觉得不是这样。你知道吗


Tags: 模块pathkeyin列表for事情dict
2条回答

您可以将每一行构建为一个字符串并执行一次写入:

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

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

首先,我看不出原始循环有什么不好的地方(可以将其转换为函数,并使用^{} context manager进行缩短)。但是,我提到了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模块。否则,使用短循环。你知道吗

相关问题 更多 >

    热门问题