2016-12-22 4 views
0

Ich möchte eine Datei mit 3 Hauptspalten machen, aber meine aktuelle Datei hat unterschiedliche Anzahl von Spalten pro Zeile. ein Beispiel für meine Datei ist wie folgt:Erstellen von Nachrichten Zeile basierend auf der Anzahl der Spalten in Python

BPIFB3,chr20;ENST00000375494.3  
PXDN,chr2,ENST00000252804.4;ENST00000483018.1 
RP11,chr2,ENST00000607956.1  
RNF19B,chr1,ENST00000373456.7;ENST00000356990.5;ENST00000235150.4 

und hier ist das, was ich machen möchte:

BPIFB3 chr20 ENST00000375494.3  
PXDN chr2 ENST00000252804.4 
PXDN chr2 ENST00000483018.1 
RP11 chr2 ENST00000607956.1  
RNF19B chr1 ENST00000373456.7 
RNF19B chr1 ENST00000356990.5 
RNF19B chr1 ENST00000235150.4 

in der Tat, wenn in der dritten Reihe haben wir mehr als 3 Spalten haben, pro jede zusätzliche Spalte, ich möchte eine neue Zeile erstellen, in der die ersten beiden Spalten gleich sind, aber die dritte Spalte ist anders (das ist die zusätzliche Spalte in der ursprünglichen Datei).

Ich habe versucht, den folgenden Code in Python aber nicht bekommen, was ich suche:

from collections import defaultdict 
with open('data.tbl') as f, open('out.tbl', 'w') as out: 
    for line in f.split('\t'): 
     if len(line) > 2: 
      d[line[0]] = line[3] 
     out.write(d.items) 
+0

Die Leute haben Ihnen die allgemeine Form einer Antwort gegeben, aber Sie haben die Beispieleingabe (insbesondere die Trennzeichen) mehrmals in Ihren Redits geändert. Was Sie aufteilen oder als Trennzeichen verwenden, sollte dem Dateiformat entsprechen. '\ t' bedeutet tab. Das Importding in allen Antworten ist das Slicing der Liste. – doctorlove

+1

Bitte machen Sie ** ** keine signifikanten Änderungen an Ihrer Frage, nachdem sie gültige Antworten erhalten hat. –

Antwort

0

Versuchen Splitting auf Kommas oder Semikolons mit re:

import re 
import csv 



with open('data.tbl') as infile, open('out.tbl','w') as outfile: 
    data = [re.split(",|;",x.strip("\n")) for x in infile] 
    output = [] 
    for line in data: 
     if len(line) > 3: 
      output.append(line[:3]) 
      for elm in line[3:]: 
       output.append(line[:2]+[elm]) 
     else: 
      output.append(line) 

    writer = csv.writer(outfile) 
    writer.writerows(output) 

Ich hoffe, das hilft.

+0

funktioniert perfekt – john

1

Wenn ist Ihre Eingabe tatsächlich wohlgeformt, Sie können dies tun:

for row in reader: 
    for thing in row[2].split(';'): 
     writer.writerow(row[:2]+[thing]) 

Aber so wie es existiert, hat Ihre erste Zeile fehlerhafte Daten, die nicht mit dem Rest Ihrer Zeilen übereinstimmen. Also, wenn das ist ein Beispiel Ihrer Daten, dann you could try replacing; mit ,, bevor Sie es an die csv Leser füttern, und dann können Sie tun:

for thing in row[3:]: 

statt.


alte Antwort auf Ihre prevous Frage:

Sie wollen einfach nur Liste schneiden. Wenn es sich um eine tabulatorgetrennte Datei handelt, können Sie einfach das csv-Modul verwenden. Und Sie importieren defaultdict, die Sie nicht verwenden.

import csv 

with open('data.tbl') as f, open('out.tbl', 'w') as out: 
    reader = csv.reader(f, delimiter='\t') 
    writer = csv.writer(out, delimiter='\t') 
    for row in reader: 
     writer.writerow(row[:3]) 
+0

es gibt die gleiche Datei – john

+0

Ich änderte auch die Frage – john

+0

Die Daten, die Sie in Ihre Frage kopiert wurde nicht Tab getrennt.Deine neuen Sachen sind csv, also musst du nur die "delimiter" -Felder entfernen. –

0

Versuchen Sie folgendes:

import csv 

with open('data.tbl') as f, open('out.tbl', 'w') as out: 
    reader = csv.reader(f, delimiter='\t') 
    writer = csv.writer(out, delimiter='\t') 
    for row in reader: 
     if len(row) == 3: 
      writer.writerow(row) 
     else: 
      n = len(row) 
      writer.writerow(row[:3]) 
      for j in range(3,n): 
       writer.writerow([row[0], row[1], row[j]]) 
+0

Wenn ich alle Semikolons in "data.tbl" durch Komma ersetze, dann funktioniert es perfekt. Um dies zu tun, muss ich das zuerst manuell tun. Wie kann ich den Code bearbeiten, ohne dass ein separater Austausch erforderlich ist? – john

2

Sie brauchen nicht Wörterbuch für dieses Problem Liste ist dafür ausreichend. Und das Trennzeichen '\ t' wird in Ihrem Problem nicht funktionieren, da es mehrere Leerzeichen gibt. Also müssen wir mehrere Leerzeichen mit re entfernen. So unten Programm wird für Ihre Lösung arbeiten.

import re 

with open('data.tbl') as f, open('out.tbl', 'w') as out: 
    for line in f: 
     line = re.sub('\s+',' ',line) 
     line = line.strip().split(' ') 
     if len(line) > 3: 
      for l in range(2,len(line)): 
       out.write(str(line[0])+' '+line[1]+ ' '+line[l]+'\n') 
     else: 
      out.write(' '.join(line)+'\n') 

Hoffe, das wird Ihnen helfen.

Verwandte Themen