2016-12-18 1 views
0

Ich habe eine Datei Text-getrennte Datei, die ich versuche, binäre Kombination pro Zeile zu machen und die Anzahl der Zeile zu jedem Paar geben.Zeichenfolge Manipulation und Hinzufügen von Werten basierend auf Zeile, die sie sind

Hier ist ein Beispiel (Sie können es auch hier herunterladen können, wenn Sie https://gist.github.com/anonymous/4107418c63b88c6da44281a8ae7a321f wollen)

"A,B  " 
"AFD,DNGS,SGDH " 
"NHYG,QHD,lkd,uyete" 
"AFD,TTT"  

Ich will es haben wie diese

A_1  B_1 
AFD_2 DNGS_2 
AFD_2 SGDH_2 
DNGS_2 SGDH_2 
NHYG_3 QHD_3 
NHYG_3 lkd_3 
NHYG_3 uyete_3 
QHD_3 lkd_3 
QHD_3 uyete_3 
lkd_3 uyete_3 
AFD_4 TTT_4 

Es bedeutet, A_1 und B_1 kommen aus die erste Reihe AFD_2 & DNGS_2 kommen aus der zweiten Reihe, etc usw.

Ich habe versucht, es zu tun, aber ich kann nicht Figur e it out

#!/usr/bin/python 
import itertools 
# make my output 
out = {} 
# give a name to my data 
file_name = 'data.txt' 
# read all the lines 
for n, line in enumerate(open(file_name).readlines()): 
    # split each line by comma 
    item1 = line.split('\t') 
    # split each stirg from another one by a comma 
    item2 = item1.split(',') 
    # iterate over all combinations of 2 strings 
    for i in itertools.combinations(item2,2): 
     # save the data into out 
     out.write('\t'.join(i)) 

Ausgang Antwort 1

"A_1, B  "_1 
"AFD_2, DNGS_2 
"AFD_2, SGDH "_2 
DNGS_2, SGDH "_2 
"NHYG_3, QHD_3 
"NHYG_3, lkd_3 
"NHYG_3, uyete"_3 
QHD_3, lkd_3 
QHD_3, uyete"_3 
lkd_3, uyete"_3 
"AFD_4, TTT"_4 

Antwort 2

"A_1 B  "_1 
"AFD_2 DNGS_2 
"AFD_2 SGDH "_2 
DNGS_2 SGDH "_2 
"NHYG_3 QHD_3 
"NHYG_3 lkd_3 
"NHYG_3 uyete"_3 
QHD_3 lkd_3 
QHD_3 uyete"_3 
lkd_3 uyete"_3 
"AFD_4 TTT"_4 
+0

viel Verwirrung hier. Erstens, warum die Aufteilung auf Tabs? Wo erwarten Sie Tabs in Ihrer Eingabedatei? Sie scheinen auch zu versuchen, in ein Wörterbuch zu schreiben. Wollten Sie eine Ausgabedatei haben? –

+0

@Paul Rooney Sorry für Verwirrung. Ich versuche, Zeilen voneinander zu trennen und deshalb benutze ich den Tab, vielleicht irre ich mich? Ich möchte nur die Ausgabe schreiben, ich werde das über – nik

+1

ändern Die Zeilen sind durch Newline getrennt, d. H. '\ N'. Deine 'Splitlines' Funktion sollte dafür sorgen. –

Antwort

1

Versuchen Sie, diese

#!/usr/bin/python 
from itertools import combinations 

with open('data1.txt') as f: 
    result = [] 
    for n, line in enumerate(f, start=1): 
     items = line.strip().split(',') 

     x = [['%s_%d' % (x, n) for x in item] for item in combinations(items, 2)] 
     result.append(x) 

for res in result: 
    for elem in res: 
     print(',\t'.join(elem)) 

Sie eine Liste der Liste der Listen müssen jedes Paar darstellen . Sie können sie mithilfe eines Listenverständnisses in einer Schleife erstellen.

Ich war nicht sicher, was Sie als Ihr tatsächliches Ausgabeformat wollten, aber dies druckt Ihre erwartete Ausgabe.

Wenn Anführungszeichen in der Eingabedatei sind, die einfache Lösung ist

items = line.replace("\"", "").strip().split(',') 

Für den obigen Code. Dies würde brechen, wenn andere doppelte Anführungszeichen in den Daten vorhanden wären. Also wenn du weißt, dass es nicht in Ordnung ist.

Andernfalls erstellen Sie eine kleine Funktion zum Entfernen der Anführungszeichen. In diesem Beispiel wird auch in eine Datei geschrieben.

#!/usr/bin/python 
from itertools import combinations 

def remquotes(s): 
    beg, end = 0, len(s) 
    if s[0] == '"': beg = 1 
    if s[-1] == '"': end = -1 
    return s[beg:end] 

with open('data1.txt') as f: 
    result = [] 
    for n, line in enumerate(f, start=1): 
     items = remquotes(line.strip()).strip().split(',') 

     x = [['%s_%d' % (x, n) for x in item] for item in combinations(items, 2)] 
     result.append(x) 

with open('out.txt', 'w') as fout: 
    for res in result: 
     for elem in res:     
      linestr = ',\t'.join(elem) 
      print(linestr) 
      fout.write(linestr + '\n') 
+0

oben schauen, habe ich die Ausgabe, wie es aussieht, ich habe wieder die Daten von xls gespeichert und es scheint das doppelte Zitat auch zu haben – nik

+0

ok meine Antwort basierte auf der Annahme, dass die Zitate weg waren. –

+0

kann ich sie direkt von 'xlsx' lesen? sie sind alle im ersten Blatt und in der ersten Spalte – nik

1

Ähnlich wie die andere Antwort bereitgestellt fügte hinzu, dass die Kommentare basierend auf es sieht aus wie Sie tatsächlich auf eine getabulatortrennte Textdatei schreiben wollen, anstatt ein Wörterbuch.

#!/usr/bin/python 
import itertools 

file_name = 'data.txt' 
out_file = 'out.txt' 

with open(file_name) as infile, open(out_file, "w") as out: 
    for n,line in enumerate(infile): 
    row = [i + "_" + str(n+1) for i in line.strip().split(",")] 
    for i in itertools.combinations(row,2): 
     out.write('\t'.join(i) + '\n') 
+0

Ich klebte die Ausgabe Ihrer Antwort oben, die nicht genau das gleiche ist wie ich wünsche – nik

+0

Ich mochte es trotzdem – nik

+0

Wenn Ihre Datei tatsächlich '' 'in ihnen dann verwenden Sie' line .strip ('' '). strip(). split (",") ' – ruaridhw

0

Die folgende scheint mit einer minimalen Menge an Code zu arbeiten:

import itertools 

input_filename = 'data.txt' 
output_filename = 'split_data.txt' 

with open(input_filename, 'rt') as inp, open(output_filename, 'wt') as outp: 
    for n, line in enumerate(inp, 1): 
     items = ('{}_{}'.format(x.strip(), n) 
        for x in line.replace('"', '').split(',')) 
     for combo in itertools.combinations(items, 2): 
      outp.write('\t'.join(combo) + '\n') 
Verwandte Themen