【问题标题】:Python3 create files from dictionaryPython3从字典创建文件
【发布时间】:2015-06-16 15:26:00
【问题描述】:

例如,我在一个名为 searchInMyDict(dict) 的函数中有一个字典。该函数中包含的字典以组名为键,以基因功能列表为值。

字典看起来像:

{"OG_1": ["gene's functionA, gene's functionB, gene's functionC"]
 "OG_2": ["gene's functionM, gene's functionL, gene's functionX"]
 "OG_XX": ["gene's functionY, gene's functionP, gene's functionR"]}

例如,“OG_1”是我的 dict 的键之一,“gene's functionA,gene's functionB,gene's functionC”是这个键的值。

我需要的是创建一个函数,它能够:创建一个以组名作为文件名的 file.txt,其中包含该组的所有基因功能,并为我的每个组创建一个这样的文件字典。

示例:file1name 是“OG_1.txt”,它包含“基因的功能A,基因的功能B,基因的功能C”。 file2name 是“OG_2.txt”,它包含“基因的功能M,基因的功能L,基因的功能X”。依此类推,直到最后一组将创建“OG_XX.txt”作为文件名并在其中包含“基因的功能M,基因的功能L,基因的功能X”。所以我希望得到很多文件,每个组一个。

我试过这样的:

def writeFilesForEveryGroupsFromDict(aDict):
for key in aDict:
    if not len(key) != len(aDict):
        f = open("key", "w")
        f.append(aDict[key])
    else:
        break

finalDict = searchInMyDict(dict)
print(writeFilesForEveryGroupsFromDico(finalDict))

但它似乎根本不起作用,我可能忘记了一些事情。有没有人有想法解决我的问题?感谢您接下来的回答!

【问题讨论】:

  • 你能解释一下什么不工作吗?
  • 当我保留“如果不是……”直到“中断”它发回:无。如果我从“if”删除到“break”,它会说:AttributeError:'_io.TextIOWrapper'对象没有属性'append'

标签: file python-3.x dictionary


【解决方案1】:
  1. 删除if not len(key) != len(aDict)break

    您可能想要做的是在迭代所有键后停止循环。但是key'OG_1''OG_2''OG_XX' 之一,它不是计数器或类似的东西。

  2. open("key", "w") 替换为open(key + ".txt", "w")

    open("key", "w") 表示“打开一个名为key 的文件进行写入”。但是你要做的是“打开一个名为<the key of the dictionary>.txt的文件”这意味着你需要key的值和.txt后缀。

  3. f.append 替换为f.write

    这就是您将字符串写入文件的方式。

  4. 使用aDict[key][0] 代替aDict[key]

    您的字典中的值是包含一个字符串的列表,因此您应该从值中仅提取该字符串。

最后,结果如下:

def writeFilesForEveryGroupsFromDict(aDict):
    for key in aDict:
        f = open(key + '.txt', 'w')
        f.write(aDict[key][0])

这应该可以。请注意,仍有改进的余地。

例如,您可以同时迭代键和值(使用aDict.values()),并且可以使用with 语句处理文件(如果出现异常,它将负责关闭文件发生):

def writeFilesForEveryGroupsFromDict(aDict):
    for key, value in aDict.values():
        with open(key + '.txt', 'w') as f:
            f.write(value[0])

【讨论】:

  • 嗨,我只需要将以下行:f.write(aDict[key]) 更改为 f.write(str(aDict[key])),但除了这个小东西它可以正常工作。非常感谢你是我的救星,我爱你:D 祝你有美好的一天
  • @Arnaud'KaRn1zC':对不起,我以为你的值是字符串。我已经修复了我的帖子。
  • 我怎样才能做同样的事情,而不是创建一个 .txt 文件,然后创建一个 .csv 文件,在这个文件中,我想在 "]," 之后分割元素,然后要求将拆分后的每个元素写在新行上??
【解决方案2】:

您的字典格式存在一些问题。我修复了它们并根据您提供的对您打算使用的字典的描述修改了格式。新字典表示值列表的键名,您的旧版本是一组非分隔字符串的键名。

由于您不使用平面数据,我建议您将数据存储在 JSON 中 - 这将保持字典结构并使其易于阅读。此代码将在与您的代码相同的目录中保存一个新的 *.json 文件,您可以在普通文本编辑器中打开和查看该文件。如果您选择使用相同的“import json”模块,则可以在另一个 python 脚本中导入和使用相同的文件。

import json 

geneFunctionDict = {
    "OG_1": ["gene's functionA", "gene's functionB", "gene's functionC"],
    "OG_2": ["gene's functionM", "gene's functionL", "gene's functionX"],
    "OG_XX": ["gene's functionY", "gene's functionP", "gene's functionR"] }


def writeFilesForEveryGroupsFromDict(aDict):
    filename = 'geneFunctionDict.json'
    with open(filename, 'w') as outfile:
        json.dump(aDict, outfile)

writeFilesForEveryGroupsFromDict(geneFunctionDict)

'''回应您的评论'''

以下代码将完全按照您在 cmets 中描述的方式执行。如果您不使用超过 10,000 个geneFunction 键,我仍然建议将 JSON 作为一种比将字典中的数据转换为平面字符串文件更灵活的存储格式。

geneFunctionDict = {
    "OG_1": "gene's functionA, gene's functionB, gene's functionC",
    "OG_2": "gene's functionM, gene's functionL, gene's functionX",
    "OG_XX": "gene's functionY, gene's functionP, gene's functionR" }

def writeFilesForEveryGroupsFromDict(filename, geneFunctionString):
    geneFunctionFile = open(filename, 'w')
    geneFunctionFile.write(geneFunctionString)

for key in geneFunctionDict.keys() :
    writeFilesForEveryGroupsFromDict(key, geneFunctionDict[key])

【讨论】:

  • 谢谢你的回答,我现在就试试这个。对于 dict 结构,我只是忘记了基因函数的 [],因为它是一个列表,我只是省略了写它,因为我只在 3 周内使用 python。
  • 哦,我刚刚注意到,使用这种方法我只有 1 个文件。我说我需要为每个组有一个文件(键名作为文件名),每个文件中写入的内容是引用组名的基因功能列表。
  • 我附加了我的答案以反映您的需求。
猜你喜欢
  • 2021-06-21
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 2013-12-06
  • 2011-10-08
  • 2012-12-15
  • 2018-03-29
  • 2021-07-21
相关资源
最近更新 更多