2017-07-03 2 views
0

Ich bin ein Anfänger in Python und ich bin ein wenig auf ein triviales Problem fest. Ich möchte einige Spalten und Zeichenfolgen aus einer Textdatei entfernen. Es ist Tab getrennt. Die erste Datei A.txtEntfernen von Spalten aus einer TXT-Datei

chr1_1792868_SNP Bcin01g04980 NON_SYNONYMOUS NON_SYNONYMOUS[T](gene:Bcin01g04980|transcript:Bcin01g04980.1|P->S:225) C T C/C C/C C/C C/C C/C C/T 234 233 232 219 233 221 234 233 232 219 233 23 0 0 0 0 0 198 

Und die Ausgabedatei (nennen wir es B.txt) sollte wie sein genannt wird:

:

1 1792868 Bcin01g04980 C T C/C C/C C/C C/C C/C C/T 234 233 232 219 233 221 234 233 232 219 233 23 0 0 0 0 0 198 

So wäre es verschiedene Operationen durchführen zu

  • entfernen Sie das „chr“ und „_“ Saiten der ersten Spalte
  • Split die 1 nach „chr“ und die Zahl nach in zwei verschiedenen Spalten
  • Entfernen Sie alle Spalten 3 und 4

ich bisher versucht zu tun:

with open ('A.txt', 'r') as mutmut_mutants: 
     dble_mut = csv.reader(mutmut_mutants, delimiter='\t') 
     with open('B.txt', 'w+') as mutants_coo: 
      mut_coo= csv.writer(mutants_coo) 
      for i in dble_mut: 
       del i[2] 
       del i[3] 
       mut_coov.writerow(i) 

Aber große Überraschung, es funktioniert nicht. Und ich spalte nicht die erste Saite in 2 Spalten. Hat jemand eine Idee, wie es weitergeht?

Vielen Dank!

+0

"Nicht funktioniert" bedeutet eine Fehlermeldung? Oder der Dateiinhalt ist falsch? – doctorlove

Antwort

1

Sie können dies versuchen:

f = open('data.txt').readlines() 

f = [i.strip('\n').split() for i in f] 

new_data = [] 

for i in f: 
    data1 = i[0].split("_") 
    new = data1[0][-1]+" "+data1[1]+" " 

    new += i[1]+" " 

    new += ' '.join(i[4:]) 

    new_data.append(new) 
print new_data[0] 

Ausgang:

'1 1792868 Bcin01g04980 C T C/C C/C C/C C/C C/C C/T 234 233 232 219 233 221 234 233 232 219 233 23 0 0 0 0 0 198' 
+0

Könnte eine Zeile zu einer Zeit sein, wenn es eine große Datei ist ... aber. – doctorlove

+0

@doctorlove was meinst du? Ich glaube, dass diese Lösung jede Zeile der Datei durchläuft. – Ajax1234

+0

Ich meine, lesen: '.readlines()' Holen Sie sich die ganze Datei im Speicher - wenn es massiv ist, werden sie Probleme, aber Ihre Analyse würde immer noch funktionieren, wenn es in einem 'für Zeile in f 'war; das Parsen schien das Problem im OP zu sein, ich habe nur darauf hingewiesen, dass das Lesen der ganzen Datei Probleme verursachen könnte – doctorlove

0

Mögliche Lösung:

with open('A.txt', 'r') as f: 
    data=f.read() 

columns = data.split('\t') 
result = [] 

temp = columns[0].split('_') 
result.append(temp[0][-1]) 
result.append(temp[1]) 

result.extend(columns[4:]) 

print result 
+0

Danke für Ihre Lösung! Ich kannte die extend() -Methode nicht, sehr ordentlich :) – Wpierrick

+0

@Wpierrick wenn es dir geholfen hat, kannst du antworten;) –

+0

habe ich upvoted, aber da ich ein neuer User mit weniger als 15 Reputation bin, wird es nicht angezeigt bis wurde aber berücksichtigt;) – Wpierrick

0

So dank der Code zur Verfügung gestellt oben (danke @ Ajax1234 und @doctorlove) Ich schaffte es, in einer Liste zu haben, was ich will. Ich habe Probleme, es richtig in einer Datei zu speichern. Ich möchte, dass es tabulatorgetrennt ist und jedes Element der Liste als neue Zeile enthält. Der Code ist

f = open('mutmut_mutants.txt').readlines() 

f = [i.strip('\n').split() for i in f] 

new_data = [] 

for i in f: 
    data1 = i[0].split("_") 
    new = data1[0][-1]+" "+data1[1]+" " 

    new += i[1]+" " 

    new += ' '.join(i[4:]) 

    new_data.append(new) 
print new_data 

outfile = open("test.txt", "w") 
print >> outfile, "\t".join(str(i) for i in new_data) 
outfile.close() 

Meine new_data Liste sieht so aus: '

[1 1792868 Bcin01g04980 CTC/CC/CC/CC/CC/CC/T 234 233 232 219 233 221 234 233 232 219 233 23 0 0 0 0 0 198 ',' 1 1792869 Bcin01g04980 CTC/CC/TC/TC/TC/TC/T 240 236 233 220 232 220 240 96 66 80 30 25 0 140 166 140 202 194 ',' 2 19718 Bcin02g00005 CAC/AC/AC/AC/AC/AC/A 86 51 78 84 87 108 63 38 58 60 63 86 22 13 20 24 24 22 ',' .... ',' .... ', '...']

Und die Ausgabe in der Textdatei sieht ok, außer dass es keine neue Linie ist am Ende jedes Element der Liste: 233

1 1792868 Bcin01g04980 CTC/CC/CC/CC/CC/CC/T 234 232 219 233 221 234 233 232 219 233 23 0 0 0 0 0 198 1 1792869 Bcin01g04980 ...

Vielen Dank für Ihre Hilfe!

Verwandte Themen