Python - 读取文件内容并使用大写内容创建新文件的函数

时间:2016-04-07 03:40:04

标签: python formatting filenames uppercase fasta

如果已经提出要求,请提前道歉,但我花了数小时寻找答案。我是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,我想克服这种挫折感,成为一个更富裕的程序员:)

3 个答案:

答案 0 :(得分:0)

一些更正/改进:

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

因此不需要{p> package com.gpstracker; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.geometry.Rectangle2D; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; import javafx.stage.Screen; import javafx.stage.Stage; public class GPSTracker extends Application { @Override public void start(Stage stage) { TextField t1 = new TextField(); TextField t2 = new TextField(); Button button = new Button("Show Location"); button.setOnAction(new EventHandler<ActionEvent>(){ @Override public void handle(ActionEvent event) { PositionService positionService = PlatformFactory.getPlatform().getPositionService(); Position position = positionService.getPosition(); } }); VBox root = new VBox(20); root.setPadding(new Insets(20)); root.getChildren().addAll(t1, t2, button); Rectangle2D visualBounds = Screen.getPrimary().getVisualBounds(); Scene scene = new Scene(root, visualBounds.getWidth(), visualBounds.getHeight()); stage.setScene(scene); stage.show(); } }

2)对于不以'&gt;'开头的每一行,此代码打开'fasta_output_file',覆盖该行然后关闭它。相反,你需要做的就是这个。

在'with'语句之前初始化变量outfile(这样你就不必在循环内打开和关闭)fasta_input_file.close()

在else语句中写入文件(outfile = open('fasta_output_file', 'a')应该在else语句中)。

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

还有几点:

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

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

答案 1 :(得分:0)

  1. 您使用dtNoOfHours.Value = duration.TotalHours; 立即覆盖传递的fasta_input_file。目前还不清楚名称是来自来电者还是来自参数。
  2. sys.argv是参数序列。您可能想要第二个sys.argv
  3. 您将字符串与名称混淆。 sys.argv[1]'fasta_input_file'不同。
  4. 当您使用fasta_input_file读取文件时,它将变为字符串。迭代字符串会产生单个字符而不是整行。
  5. 而不是检查条件,然后执行read(),如果符合条件,请检查pass该条件,然后在那里做任何需要做的事情。
  6. not再次与'fasta_output_file'不一样。
  7. 您打开了输出文件但未保存引用(例如fasta_output_file)或创建上下文管理器(例如out = open(...)。
  8. 您正在关闭单个&#34;行之后的输入和输出文件。&#34;
  9. 以下是您的代码可能看起来像这些错误的示例:

    with open(...) as out:

答案 2 :(得分:0)

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