2017-03-24 4 views
-1

Ich habe ein Python-Skript, das funktioniert gut, wenn ich es in dem Ordner ausführen, der die Dateien enthält, die ich brauche. Aber ich möchte das Skript ändern, dass es in jeden Unterordner geht, die Dateien pro Unterordner verwendet und eine Ausgabedatei in jeden Unterordner schreibt. Ich habe über os.walk usw. gelesen, aber ich verstehe nicht, wie ich mein Skript ändern kann, dass os.walk funktioniert. Bitte hilf mir. Das Skript wird al folgt:Python; Scripte in allen Unterordnern ausführen

d1 = {} 
with open('genes.gff.genespercontig.csv', 'r') as f: 
for line in f: 
     tok = line.split() 
     d1[tok[1]] = int(float(tok[0])) 

d2 = {} 
with open('hmmer.analyze.txt.result.txt', 'r') as f2: 
    for line in f2: 
     tak = line.split() 
     d2[tak[1]] = int(float(tak[0])) 

from itertools import chain 
from collections import defaultdict 
d3 = defaultdict(list) 
for k, v in chain(d1.items(), d2.items()): 
    d3[k].append(v) 

import csv  
with open('output_contigsvsgenes.csv', 'w') as f: 
    writer = csv.writer(f)  
    for k,v in d3.items(): 
     writer.writerow([k] + v) 

Antwort

3

Wenn Sie wissen, dass jede Datei, die Sie versuchen, in den Baum in jedem Verzeichnis zur Verfügung zu lesen sein wird, dann können Sie einfach Ihre aktuelle Skript in einem os.walk Block wickeln:

import os 

for root, dirs, files in os.walk('.'): 
    d1 = {} 
    with open(os.path.join(root, 'genes.gff.genespercontig.csv'), 'r') as f: 
     for line in f: 
      tok = line.split() 
      d1[tok[1]] = int(float(tok[0])) 

    d2 = {} 
    with open(os.path.join(root, 'hmmer.analyze.txt.result.txt'), 'r') as f2: 
     for line in f2: 
      tak = line.split() 
      d2[tak[1]] = int(float(tak[0])) 

    from itertools import chain 
    from collections import defaultdict 
    d3 = defaultdict(list) 
    for k, v in chain(d1.items(), d2.items()): 
     d3[k].append(v) 

    import csv 
    with open(os.path.join(root, 'output_contigsvsgenes.csv'), 'w') as f: 
     writer = csv.writer(f) 
     for k,v in d3.items(): 
      writer.writerow([k] + v) 

Andernfalls müssen Sie sich vor dem Fall schützen, in dem die Dateien, die Sie suchen, möglicherweise nicht existieren. Da es scheint, dass Sie Werte aus beiden Dateien benötigen, um Ihre Ausgabe zu erstellen, dann ist es wahrscheinlich gut die ganze Sache in einem try-Block zu wickeln:

import os 

for root, dirs, files in os.walk('.'): 
    try: 
     d1 = {} 
     with open(os.path.join(root, 'genes.gff.genespercontig.csv'), 'r') as f: 
      for line in f: 
       tok = line.split() 
       d1[tok[1]] = int(float(tok[0])) 

     d2 = {} 
     with open(os.path.join(root, 'hmmer.analyze.txt.result.txt'), 'r') as f2: 
      for line in f2: 
       tak = line.split() 
       d2[tak[1]] = int(float(tak[0])) 

     from itertools import chain 
     from collections import defaultdict 
     d3 = defaultdict(list) 
     for k, v in chain(d1.items(), d2.items()): 
      d3[k].append(v) 

     import csv 
     with open(os.path.join(root, 'output_contigsvsgenes.csv'), 'w') as f: 
      writer = csv.writer(f) 
      for k,v in d3.items(): 
       writer.writerow([k] + v) 
    except: 
     print traceback.format_exc() 

Wenn Sie die einzelnen Dateien separat behandeln möchten, dann können Sie ändern die oben, um den Fall zu behandeln, in dem eine Datei, aber nicht die andere vorhanden ist.

+0

Vielen Dank für Ihre Hilfe, aber wenn ich das versuche, bekomme ich den folgenden Fehler: IOError: [Errno 2] Keine solche Datei oder Verzeichnis: './genes.gff.genespercontig.csv'. Ich bin mir sehr sicher, dass sich die Dateien in jedem Unterverzeichnis befinden, aber es scheint, dass das Skript sie nicht finden kann. – Gravel

+0

Ich habe das zweite Beispiel bearbeitet, um alle Fehler zu erfassen, nicht nur Namensfehler. Hoffentlich sollte sich das kümmern. Wenn Sie sicher sind, dass die Dateien vorhanden sind, sie aber nicht finden können, versuchen Sie, die Dateivariable zu drucken, um sicherzustellen, dass sie tatsächlich da sind. – WillySchu

+0

Es tut mir leid, aber auch das zweite Beispiel gibt den gleichen Fehler – Gravel

Verwandte Themen