2016-10-21 5 views
-1

Sagen wir, ich habe eine Textdatei mit den Inhalten unter:Erstellen von einfachen Tupel aus Textdatei

50 8 2 DDBD_DCAABCDABCD_ABBAC_DDBD_DCAABCDABCD_ABB 

Mein Ziel ist es, eine Funktion zu erstellen, die aus der Textdatei liest und gibt ein Tupel in folgendem Format:

(50, 8, 2, "DDBD_DCAABCDABCD_ABBAC_DDBD_DCAABCDABCD_ABB") 
+1

'(50, 8, 2, ...)' nicht viel Sinn macht, wo Sind diese Zahlen gekommen? m? –

+1

Danke, dass Sie uns gesagt haben, was Sie tun müssen, was haben Sie versucht und haben Sie eine Frage? – MooingRawr

+0

Sorry meine schlechte, siehe bearbeiten – Brian

Antwort

1

Sie können nur die Tupel mit den integer-Konvertierungen manuell konstruieren:

def foo(filename): 
    with open(filename) as file: 
     t = file.read().split() 
    return (int(t[0]), int(t[1]), int(t[2]), t[3]) 

Oder wenn möchten Sie Lust sein: in Python weggelassen werden kann 2.

Oder

return tuple(list(map(int, t[:3])) + [t[3]]) 

Der list Aufruf:

return tuple(f(x) for x, f in zip(t, (int, int, int, str))) 
0

Verwenden split Funktion eine Zeichenfolge in ein Tupel von Strings aufteilen . Die int Funktion wird dann versuchen, es zu analysieren, ValueError zu erhöhen, wenn es nicht möglich ist. Der try/except Block fängt dann den Fehler ab und übergibt stattdessen den ursprünglichen String.

def tuple_parser(text): 
    raw_parts = text.split() 
    parsed_parts = [] 
    for raw_part in raw_parts: 
     try: 
      parsed_part = int(raw_part) 
     except ValueError: 
      parsed_part = raw_part 
     parsed_parts.append(parsed_part) 
    return tuple(parsed_parts) 


def tuple_file_parser(filename) 
    with open(filename, 'r') as f: 
     text = f.read() 
     return tuple_parser(text) 

Wenn Sie mehrere Zeilen wie diese in der Datei haben, können Sie tuple_parser in einer Schleife aufrufen. Iterieren über ein file-Objekt zurück zu einer Zeit, die Linien ein:

with open(filename, 'r') as f: 
    tuples = [tuple_parser(line) for for line in f] 
+0

Abgesehen von der Länge des Codes, was ist falsch an dieser Implementierung? –

+0

@ Jean-FrançoisFabre Die Hölle, wenn ich weiß. Wenn es kein sexy One-Liner ist, dann gehört es offensichtlich nicht zu SO. –

+0

Vielleicht wird die Frage als schlecht angesehen, also müssen die Antworten _really_ sexy sein. –

0

Sie es allgemein in einer Linie tun können (Unterstützung für ints und Streicher) mit einem genecomp zu einem nur tuple bestand

the_tuple = tuple(int(x) if x.isdigit() else x for x in z.split()) 

arbeitet mit positiven ganzen Zahlen, wenn Sie Negative möchten, können aber die 1-Liner ist hässlicher erfolgen:

the_tuple = tuple(int(x) if x.isdigit() or (x and x[0]=='-' and x[1:].isdigit()) else x for x in z.split()) 
+1

Kein Tupel, sondern ein Tupel. – MooingRawr

+0

bearbeitet. Vielen Dank. –

Verwandte Themen