2016-04-08 5 views
-1

Ich habe drei Dateien:Python: Text ersetzt in zwei Dateien mit einem Schlüsselwort?

  1. Liste der Schlüsselwörter:

    file1

    NM_000015 
    
  2. Tabellendaten i einfügen müssen:

    file2

    NM_000015 10 NAT2 N-acetyltransferase 2 9606 
    
  3. Rohdaten, wo ich muss eingefügt werden:

    file3

    hsa-miR-153-5p NM_000015 65.4643 
    

Ich brauche von file1 Keywords verwenden Linien zu finden, dass Schlüsselwort in Datei2 und ersetzen dieses Schlüsselwort in file3 mit Linien von file2 enthält.

Ergebnis:

hsa-miR-153-5p NM_000015 65.4643 

hsa-miR-153-5p NM_000015 10 NAT2 N-acetyltransferase 2 9606 65.4643 
+0

Könnten Sie bitte Ihre Frage ein wenig besser formatieren? Ich würde eine Bearbeitung vorschlagen, aber ich bin mir nicht sicher, wie ich das bearbeiten soll. – Bahrom

+0

Bitte lesen Sie dies: http://stackoverflow.com/help/how-to-ask und bearbeiten Sie Ihre Frage entsprechend. – Dataman

+0

ich würde gerne helfen, aber wie die anderen gesagt haben, muss ihre frage dringend bearbeitet werden, um verstanden zu werden. –

Antwort

0

Hier meine Python 2-Version ist:

# Construct list of keywords 
# ** EDIT** this might be better as a set 
# A list will use less memory, but a set is much faster lookup 
keywords = [kw.rstrip() for kw in open('file1')] 

# Construct dictionary of keywords 
kvdict = {} 

with open('file2') as f2: 
    for line in f2: 
     kw = line.split()[0] 
     if kw in keywords: 
      kvdict[kw] = line.rstrip() 

with open('file3') as f3: 
    for line in f3: 
     kw = line.split()[1] 
     if kw in kvdict: 
      newline = line.replace(kw, kvdict[kw]) 
      print newline,  # or maybe write it to a file? 

aber auf überschaubare Anzahl von Schlüsselwörtern abhängt. Es hängt auch davon ab, dass jede Zeile in Datei3 mindestens zwei Felder enthält.

Für Python 3 ändern Sie die endgültige print Anweisung zu print(newline, end='').

EDIT: Um den Speicher-Overhead des Wörterbuchs zu vermeiden, ersetzen

kvdict = {} 

mit:

import shelve 
kvdict = shelve.open('keywords') 

und am Ende des Programms Put:

kvdict.close() 

könnten Sie möchte auch am Ende die keywords Datei entfernen.

0

Wie andere bemerkt, Ihre Frage fehlt Details Umsetzung zu führen. Wenn ich Sie richtig verstanden habe, könnte so etwas wie dies funktionieren:

file1 = open("path_to_file1") 
file2 = open("path_to_file2") 
file3 = open("path_to_file3") 

keywords = [ line[:-1] for line in file1 if line.strip() ] 

translations = { 
    line.partition(' ')[0]: line.partition(' ')[2][:-1] 
    for line in file2 
} 

for line in file3 : 
    if not line : continue 
    for kwd in keywords : 
     if kwd in line : 
      print line.replace(kwd, translations[kwd])[:-1] 
      break 
    else : 
     print line[:-1] 

Implementierung könnte nach Ihren Vorgaben unterscheiden: Was tun mit Linien in file3 geschieht, die nicht in file2 angegeben werden? Was passiert mit Übersetzungen in Datei2, die nicht in Datei1 enthalten sind? Können Zeilen in Datei3 mehr als ein Schlüsselwort enthalten, das ersetzt werden sollte? etc. etc.

+0

Ehrlich, ich habe dich nicht kopiert! – cdarke

Verwandte Themen