2016-04-07 17 views
0

Entschuldigung im Voraus, wenn dies bereits gefragt wurde, aber ich habe Stunden damit verbracht, nach Antworten zu suchen. Ich bin ein neuer Schüler zu Python (3.5.1, Windows 10) und meine Aufgabe ist es, eine Funktion zu schreiben, die den Inhalt einer Fasta-Datei liest (deren Name vom Benutzer angegeben wird) und eine neue Datei erstellt (Name ebenfalls angegeben) Nach dem Benutzer könnte .fasta oder .txt) mit den Fasta-Sequenzen in Großbuchstaben. Eine Fasta-Datei wird so formatiert, dass dem Titel einer Sequenz ein Caret vorangestellt wird und die nachfolgenden Zeilen Zeichen sind (die, die ich in Großbuchstaben schreiben möchte). Eine Fasta-Datei kann mehrere> Zeilen enthalten, die in der Datei enthalten sind. Ich möchte diese Zeilen nicht groß schreiben.Python - Funktion, die den Inhalt einer Datei liest und eine neue Datei mit Inhalt in Großbuchstaben erstellt

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

Zum Beispiel dieser Fasta Datei:

Name der Sequenz cgtatgggggtattccgtagctctgctgacgcgcttatatttagc cgctcgatctggaggactctgcgatcgcggcatcgagctagcggc

würde wie folgt geschrieben werden:

Name des Sequen ce CGTATGGGGGGTATTCCGTAGCTCTGCTGACGCGCTTATATTTAGC CGCTCGATCTGGAGGACTCTCGATCGCGGCATCGAGCTAGCGCGGC

Ich bin sicher, dass dies nur gespickt mit offensichtlichen Fehlern ist, aber wieder ich bin ein Student versuchen zu lernen. Bitte sei höflich! Vielen Dank im Voraus für jede Beratung oder Tipps, die Sie haben, ich habe es genossen Python wirklich und ich mag diese Frustration überwinden und zu einem reicheren Programmierer :)

Antwort

0

Einige Korrekturen/Verbesserungen:

1) Wenn Sie die Datei mit einer "mit" -Anweisung öffnen, müssen Sie sie nicht explizit schließen. Mit das macht das für Sie.

fasta_input_file.close() wird daher nicht benötigt.

2) Für jede Zeile, die nicht mit '>' beginnt, öffnet dieser Code die 'fasta_output_file', überschreibt die Zeile und schließt sie dann. Stattdessen müssen Sie das tun.

initialisieren die Variable outfile, bevor die ‚mit‘ Anweisung (Damit Sie müssen nicht öffnen und schließen innerhalb der Schleife) in der else-Anweisung sein outfile = open('fasta_output_file', 'a')

Schreiben auf die Datei in der else-Anweisung (outfile.write(g) sollte).

Schließen Sie die Ausgabedatei, nachdem die Anweisung 'with' beendet wurde. outfile.close()

Ein paar weitere Punkte:

Sie müssen die write() und close() Methoden auf dem Dateiobjekt aufzurufen, die erstellt wird, wenn Sie die Datei öffnen.

Außerdem übergeben Sie die Dateinamen als Argument für die Funktion und versuchen auch, von den Befehlszeilenargumenten zu lesen. Sie müssen nur eines der beiden tun.

0
  1. Sie überschreiben die übergeben fasta_input_file sofort mit sys.argv.Es ist unklar, ob die Namen vom Aufrufer oder von Argumenten stammen sollten.
  2. sys.argv ist die Reihenfolge der Argumente. Sie wollen wahrscheinlich die zweite, sys.argv[1].
  3. Sie verwechseln Strings mit Namen. 'fasta_input_file' ist nicht dasselbe wie fasta_input_file.
  4. Wenn Sie eine Datei mit read() lesen, wird daraus eine Zeichenfolge. Das Iterieren einer Zeichenfolge erzeugt einzelne Zeichen anstelle von ganzen Zeilen.
  5. Anstatt eine Bedingung zu überprüfen und dann pass zu tun, wenn es erfüllt ist, überprüfen Sie für not diese Bedingung und dann tun, was auch immer getan werden muss.
  6. 'fasta_output_file' ist wiederum nicht dasselbe wie fasta_output_file.
  7. Sie haben die Ausgabedatei geöffnet, aber keine Referenz gespeichert (z. B. out = open(...) oder einen Kontextmanager erstellt (z. B. with open(...) as out:).
  8. Sie schließen die Eingabe- und Ausgabedateien nach einer einzigen "Zeile". Hier

ist eine Probe von dem, was Ihr Code wie mit diesen Fehlern aussehen könnte gesorgt:

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

Was falsch war mit nur anrufen 'oberen()'? –

+0

@JoelCornett werfen Sie einen Blick auf Beispiele. Ouwan12 möchte nur Nukleotidsequenzen konvertieren und alles andere unverändert lassen, einschließlich Sequenzkopfzeilen. Oder habe ich einen leichteren Weg verpasst? –