【问题标题】:Python - Function that reads content of a file and creates new file with contents in uppercasePython - 读取文件内容并使用大写内容创建新文件的函数
【发布时间】:2016-04-07 03:40:03
【问题描述】:

如果已经有人问过这个问题,请提前道歉,但我花了几个小时寻找答案。我是 Python 的新学生(3.5.1,Windows 10),我的任务是编写一个函数来读取 Fasta 文件(其名称由用户给出)的内容并创建一个新文件(名称也给出按用户,可以是 .fasta 或 .txt),Fasta 序列为大写。一个fasta文件被格式化,所以序列的标题前面有一个插入符号,后面的行是字符(我想大写的那些)。 fasta 文件可能在整个文件中包含多个 > 行,我不想将这些行大写。

import sys
def fasta_upper(fasta_input_file, fasta_output_file):
    fasta_input_file = sys.argv
    with open('fasta_input_file', 'r') as f:
        file_contents = f.read()
        temp_contents = file_contents[:]
        for line in temp_contents:
            if line.startswith('>'):
                pass
            else:
                g = line.upper()
                open('fasta_output_file', 'w')
                fasta_output_file.write(g)
                fasta_input_file.close()
                fasta_output_file.close()

例如这个 Fasta 文件:

序列名称 cgtatgggggtattccgtagctctgctgacgcgcttatatttagc cgctcgatctggaggactctgcgatcgcggcatcgagctagcggc

会这样写:

序列名称 CGTATGGGGGGTATTCCGTAGCTCTGCTGACGCGCTTATATTTAGC CGCTCGATCTGGAGGACTCTCGATCGCGGCATCGAGCTAGCGCGGC

我确信这只是充满了明显的错误,但我还是一个正在努力学习的学生。请温柔一点!预先感谢您提供的任何建议或提示,我真的很喜欢 Python,我想克服这种挫败感,成为一个更富裕的程序员 :)

【问题讨论】:

    标签: python formatting filenames uppercase fasta


    【解决方案1】:

    一些更正/改进:

    1) 如果您使用“with”语句打开文件,则不必显式关闭它。为你做这件事。

    因此不需要fasta_input_file.close()

    2) 对于不以“>”开头的每一行,此代码将打开“fasta_output_file”,覆盖该行,然后将其关闭。相反,您需要做的是这个。

    在'with'语句之前初始化变量outfile(这样你就不必在循环内打开和关闭)outfile = open('fasta_output_file', 'a')

    在 else 语句中写入文件(outfile.write(g) 应该在 else 语句中)。

    在'with'语句退出后关闭输出文件。 outfile.close()

    还有几点:

    您需要在打开文件时创建的文件对象上调用 write() 和 close() 方法。

    此外,您将文件名作为参数传递给函数,并尝试从命令行参数中读取。您只需要执行这两项中的一项即可。

    【讨论】:

      【解决方案2】:
      1. 您立即用sys.argv 覆盖传递的fasta_input_file。目前尚不清楚名称应该来自调用者还是来自参数。
      2. sys.argv 是参数序列。您可能想要第二个,sys.argv[1]
      3. 您将字符串与名称混淆了。 'fasta_input_file'fasta_input_file 不同。
      4. 当您读取带有read() 的文件时,它会变成一个字符串。迭代字符串会产生单个字符而不是整行。
      5. 与其检查一个条件,然后在满足时执行 pass,不如检查 not 该条件,然后在其中执行任何需要执行的操作。
      6. 'fasta_output_file' 再次与 fasta_output_file 不同。
      7. 您打开了输出文件,但没有保存引用(例如out = open(...)或创建上下文管理器(例如with open(...) as out:)。
      8. 您正在关闭单个“行”之后的输入和输出文件。

      以下是处理这些错误后代码的示例:

      import sys
      
      def fasta_upper():
          fasta_input_file, fasta_output_file = sys.argv[1], sys.argv[2]
          with open(fasta_input_file) as f, open(fasta_output_file, 'w') as output:
              for line in f:
                  if not line.startswith('>'):
                      line = line.upper()
                  output.write(line)
      
      fasta_upper()
      

      【讨论】:

        【解决方案3】:
        import sys
        import re
        
        if len(sys.argv) < 3:
            print('Usage:\n\t{} <input file> <output file>'.format(sys.argv[0]))
            sys.exit(1)
        
        pattern = re.compile(r'\b[acgturykmswbdhvnx\-]+\b', re.M)
        
        def repl(m):
            return m.group(0).upper()
        
        
        with open(sys.argv[1], 'r') as in_fh, open(sys.argv[2], 'w') as out_fh:
            for line in in_fh:
                if line.startswith('>'):
                    out_fh.write(line)
                else:    
                    out_fh.write(pattern.sub(repl, line))
        

        【讨论】:

        • @JoelCornett 好好看看例子。 Ouwan12 只想转换核苷酸序列,其他所有内容保持不变,包括序列标题。还是我错过了更简单的方法?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多