【问题标题】:Read text-file into program as dictionary将文本文件作为字典读入程序
【发布时间】:2017-10-23 11:29:45
【问题描述】:

使用 Python 3。

我必须编写一个带有一个参数(一个字符串)的函数,并且必须从一个包含序列(键)和序列(值)名称的 txt 文件中返回一个字典。键和值都必须是字符串。

文本文件:

Read1 GGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTCGTCCAGACCCCTAGC
Read2 CTTTACCCGGAAGAGCGGGACGCTGCCCTGCGCGATTCCAGGCTCCCCACGGG
Read4 TGCGAGGGAAGTGAAGTATTTGACCCTTTACCCGGAAGAGCG
Read3 GTCTTCAGTAGAAAATTGTTTTTTTCTTCCAAGAGGTCGGAGTCGTGAACACATCAGT
Read5 CGATTCCAGGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTC
Read6 TGACAGTAGATCTCGTCCAGACCCCTAGCTGGTACGTCTTCAGTAGAAAATTGTTTTTTTCTTCCAAGAGGTCGGAGT

我已经走了这么远,但我认为我遗漏了一些东西,我不知道我在这里的工作是否正确。我已经标记了我怀疑它是否正确的行(用#)。

def read_data(file_name):
    input_file=open(sequencing_reads.txt)
    #sequence_dict={}
    for line in input_file:
        #x=line.split(",")
    #return sequence_dict
    input_file.close()

我知道它必须返回具有以下内容的字典:

{'Read1': 'GGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTCGTCCAGACCCCTAGC',
 'Read2': 'CTTTACCCGGAAGAGCGGGACGCTGCCCTGCGCGATTCCAGGCTCCCCACGGG',
 'Read4': 'TGCGAGGGAAGTGAAGTATTTGACCCTTTACCCGGAAGAGCG',
 'Read3': 'GTCTTCAGTAGAAAATTGTTTTTTTCTTCCAAGAGGTCGGAGTCGTGAACACATCAGT',
 'Read5': 'CGATTCCAGGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTC',
 'Read6': 'TGACAGTAGATCTCGTCCAGACCCCTAGCTGGTACGTCTTCAGTAGAAAATTGTTTTTTTCTTCCAAGAGGTCGGAGT'}

你能帮我填补空白吗?

编辑:我需要保持简单,所以请不要导入包和聪明的技巧:-)

编辑 2:

我也试过这个:

with open('sequencing_reads.txt', 'r') as document:
    answer = {}
    for line in document:
        line = line.split()
        if not line:  
            continue
        answer[line[0]] = line[1:]
print(answer)

输出是:

{'Read1': ['GGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTCGTCCAGACCCCTAGC'], 'Read2': ['CTTTACCCGGAAGAGCGGGACGCTGCCCTGCGCGATTCCAGGCTCCCCACGGG'], 'Read4': ['TGCGAGGGAAGTGAAGTATTTGACCCTTTACCCGGAAGAGCG'], 'Read3': ['GTCTTCAGTAGAAAATTGTTTTTTTCTTCCAAGAGGTCGGAGTCGTGAACACATCAGT'], 'Read5': ['CGATTCCAGGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTC'], 'Read6': ['TGACAGTAGATCTCGTCCAGACCCCTAGCTGGTACGTCTTCAGTAGAAAATTGTTTTTTTCTTCCAAGAGGTCGGAGT']}

如何去除序列周围的“[ ]”?

EDIT4:

def read_data(file_name):
    with open("sequencing_reads.txt", "r") as document:
        answer = {}
        for line in document:
            line = line.split()
            if not line:
                continue
                answer[line[0]] = line[1:]
                final_answer = {a:b[0] for a, b in answer.items()}
final_answer = read_data("sequencing_reads.txt")
print(final_answer)

打印:

None

【问题讨论】:

    标签: python dictionary input


    【解决方案1】:

    你可以试试这个:

    import re
    def read_data(file_name):
       data = open(file_name).read()
       keys = [filter(lambda x:bool(x), i)[0][1:-1] for i in re.findall("{(.*?)\:|(?<=,\n\s)(.*?)\:", data)]
       values = [filter(lambda x:bool(x), i)[0][1:-1] for i in re.findall('(?<=:\s)(.*?)(?=,\n)|(?<=\s)(.*?)(?=})', data)]
       final_data = {a:b for a, b in zip(keys, values)}
       return final_data
    

    输出:

    {'Read1': 'GGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTCGTCCAGACCCCTAGC', 'Read3': 'GTCTTCAGTAGAAAATTGTTTTTTTCTTCCAAGAGGTCGGAGTCGTGAACACATCAGT', 'Read2': 'CTTTACCCGGAAGAGCGGGACGCTGCCCTGCGCGATTCCAGGCTCCCCACGGG', 'Read5': 'CGATTCCAGGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTC', 'Read4': 'TGCGAGGGAAGTGAAGTATTTGACCCTTTACCCGGAAGAGCG', 'Read6': "'Read6': 'TGACAGTAGATCTCGTCCAGACCCCTAGCTGGTACGTCTTCAGTAGAAAATTGTTTTTTTCTTCCAAGAGGTCGGAGT"}
    

    编辑:

    import ast 
    def read_data(file_name):
       final_data = ast.literal_eval(open(file_name).read())
       return final_data
    

    编辑1:关于去除括号,只需通过索引访问值:

    final_answer = {a:b[0] for a, b in answer.items()}
    print(final_answer)
    

    如果您在打印从read_data 返回的值时遇到问题,您可以试试这个:

    answer = read_data("the_file.txt")
    print(answer)
    

    编辑 3:

    def read_data(file_name):
       with open(file_name, "r") as document:
          answer = {}
          for line in document:
             line = line.split()
             if line:
                answer[line[0]] = line[1:]
          return {a:b[0] for a, b in answer.items()}
    
    print(read_data("sequencing_reads.txt"))
    

    【讨论】:

    • 谢谢,但是我要写什么才能打印出来?似乎无论我打印什么,我都会遇到某种错误。此外,txt 文件已经包含名称(read1,read2 等),所以基本上我只想让 python 将文件作为字典打开
    • 黑帮蟒蛇。识别隐式上下文管理器花了一秒钟。在 lambda 中看到这一点会很有趣。
    • @RicklePick 请查看我最近的编辑。当我意识到您发布了文件的内容而不是所需的输出时,我改变了我的原始答案。因此,这个解决方案应该输出你所需要的。
    • @Ajax1234 这太过分了。打开文件而不关闭它,然后使用正则表达式实现一个 json 解析器。
    • @everyone 在这种情况下,调用open('file.txt')后不需要关闭文件,因为Python会自动关闭它。关于 json 解析器,不能保证文件的内容已经被格式化为 json
    【解决方案2】:

    您的文件 "sequencing_reads.txt" 是 json 格式。您可以使用 python 标准库中的 json 模块将您的内容轻松加载到字典中。

    import json
    
    with open("sequencing_reads.txt") as f:
        sequence_dict = json.load(f)
    

    【讨论】:

    • @RicklePick 尝试将文件读入字符串,然后使用json.loads 将其解析为字典。
    【解决方案3】:

    首先,如果你的文件是 json 格式并且分行,你应该把它读成一行,可能是这样的:

    def read_data(file_name):
        lines = open(file_name).readlines()
        merged_line = " ".join([line.strip() for line in lines])
    

    其次,json.loads 需要为字符串加上双引号(例如:{"a":"a"})。如果您使用单引号(如您的示例中所示),则可能会出现错误。所以你可以这样做:

    # 1,use json.loads, but replace first
    import json
    merged_line = merged_line.replace("'", '"')
    data = json.loads(merged_line)
    
    # 2,use ast
    import ast
    data = ast.literal_eval(merged_line)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多