2016-04-05 18 views
0

Ich lese aus einer Datei, die Folgendes enthält.Trennzeichenfolge mit mehreren Trennzeichen

87965164,Paris,Yu,6/27/1997 
87965219,Heath,Moss,10/13/1996 
87965187,Cale,Blankenship,10/22/1995 
87965220,Terrence,Watkins,12/7/1996 
87965172,Ansley,Padilla,3/30/1997 

ich brauche die die Linien an der aufzuspalten „“ und ‚/‘, und auch die ‚\ n‘ von dem Ende zu entfernen.

ich möchte meine Ausgabe wie folgt aussehen, wenn sie in eine Liste gesetzt:

[['87965164', 'Paris', 'Yu', 6, 27, 1997], ['87965219', 'Heath', 'Moss', 10, 13, 1996], ['87965187', 'Cale', 'Blankenship', 10, 22, 1995], ['87965220', 'Terrence', 'Watkins', 12, 7, 1996], ['87965172', 'Ansley', 'Padilla', 3, 30, 1997]] 
+3

Haben Sie überhaupt etwas versucht? – usr2564301

Antwort

2

You're going to want regular expressions.

import re 

results = [] 
for line in fl: 
    # [,/] means "match if either a , or a/is present" 
    results.append(re.split('[,/]',line.strip())) 

Wenn Sie eine besonders große Datei haben, können Sie es in einem Generator wickeln:

import re 
def splitter(fl): 
    for line in fl: 
    # By using a generator, you are only accessing one line of the file at a time. 
    yield re.split('[,/]',line.strip()) 
0

Für jede Zeile:

parts = line.split(',') 
parts[-1:] = map(int, parts[-1].split('/')) 

Dies verarbeitet Eingaben, die Schrägstriche in Nicht-Datumsteilen enthalten, korrekt und verarbeitet die Konvertierung in Ganzzahlen gleichzeitig.

1

Simpler als regex:

[line.replace('/', ',').split(',') for line in text.split('\n')] 

Sie können danach Zahlen in int s verwandeln.

Allerdings glaube ich, dass Sie nach dem falschen Weg suchen, es zu tun. Der richtige Weg ist, sich durch Kommas zu trennen und dann spezielle Felder zu behandeln.

from datetime import datetime 
from collections import namedtuple 

Person = namedtuple('Row', ['idn', 'first', 'last', 'birth']) 

def make_person(idn, first, last, birth): 
    return Person(idn, first, last, 
        datetime.strptime(birth, "%m/%d/%Y")) 

records = [make_person(*line.split(',')) for line in text.split('\n')] 
1

Anstatt heterogenen Daten in einer homogenen Datentyp zu speichern, würde ich unter Verwendung von Wörterbüchern oder Erstellen einer Klasse empfehlen.

Mit Wörterbücher:

results = {} 
with open('in.txt') as f: 
    for line in f: 
     id, first, last, day = line.split(',') 
     month, day, year = map(int, day.split('/')) 
     results[id] = {'id':id, 'first':first, 'last':last, 
         'month':month, 'day':day, 'year':year} 

Mit einer Klasse:

class Person: 
    def __init__(self, id, first, last, day): 
     self.id = id 
     self.first = first 
     self.last = last 
     self.month, self.day, self.year = map(int, day.split('/')) 

results = {} 
with open('in.txt') as f: 
    for line in f: 
     id, first, last, day = line.split(',') 
     results[id] = Person(id, first, last, day) 

Beachten Sie, dass ich in jedem Fall Informationen jeder Person als Eintrag in einem Wörterbuch bin speichern, mit einem Schlüssel von dem, was aussieht ihre ID-Nummer.

+0

Ich glaube, dass genau das 'namedtuple' für – Elazar

+0

@Elazar erstellt wurde -' nametuple' fügt 'tuple's Objektnotation hinzu, aber ein' tuple' ist immer noch ein homogener Datentyp (sowie unveränderlich, im Gegensatz zu 'list 's). – TigerhawkT3

+0

Ich stimme nicht zu. Die Notation ist der wichtige Teil. Unveränderlichkeit ist ein anderes Merkmal. Und die Tatsache, dass Sie über die Felder iterieren können, erleichtert das Drucken in verschiedenen Formaten. – Elazar

Verwandte Themen