2017-05-20 5 views
2

Parsing habe ich mit etwa 20 Einträgen eine Textdatei. Sie sehen wie folgt aus:eine Textdatei mit Zeilenumbrüchen in Python

~ 

England 
Link: http://imgur.com/foobar.jpg 
Capital: London 
~ 
Iceland 
Link: http://imgur.com/foobar2.jpg 
Capital: Reykjavik 
... 

usw.

Ich möchte diese Einträge nehmen und sie in eine CSV. Es gibt ein '~', das jeden Eintrag trennt. Ich kratze mich am Kopf und versuche herauszufinden, wie man Zeile für Zeile vorgeht und die CSV-Werte für jedes Land erstellt. Kann mir jemand einen Hinweis geben, wie ich das anstellen soll?

+0

Können Sie ein Beispiel für die endgültige Ausgabe angeben, die Sie wünschen? – lukess

+0

durch Zeile für Zeile in der Datei gehen und einfach Split gilt von ‚/ n‘ (für den Inhalt der Datei zu speichern) und prüfen, ob ‚~‘ – Aditya

Antwort

-1
import csv 

datafile = 'unparsed_countries.txt' 
new_file = 'parsed_countries.csv' 
with open(datafile, 'r') as f: 
    data = [] 
    country = [] 

    for line in f: 
     line = line.strip() 
     if line == '~': 
      data.append(country) 
      country = [] 
     else: 
      country.append(line) 

with open(new_file, 'w', newline='\n') as myfile: 
    wr = csv.writer(myfile, lineterminator='\n', delimiter=',') 
    wr.writerows(data) 



Output file: 

England,Link: http://imgur.com/foobar.jpg,Capital: London 
Iceland,Link: http://imgur.com/foobar2.jpg,Capital: Reykjavik 
England,Link: http://imgur.com/foobar.jpg,Capital: London 
Iceland,Link: http://imgur.com/foobar2.jpg,Capital: Reykjavik 
0

Die Art und Weise, dass ich das tun würde, wäre die open() Funktion verwenden, um die Syntax der Verwendung:

f = open('NameOfFile.extensionType', 'a+') 

Wo "a +" -Modus ist anhängen. Die Datei wird nicht überschrieben und neue Daten können angehängt werden. Sie könnten auch "r +" verwenden, um die Datei im Lesemodus zu öffnen, aber die Bearbeitungsfähigkeit verlieren. Das "+" hinter einem Buchstaben bedeutet, dass wenn das Dokument nicht existiert, es erstellt wird. Das "a +" habe ich nie ohne das "+" gefunden.

Danach würde ich eine for-Schleife wie folgt verwenden:

data = [] 
tmp = [] 
for line in f: 
    line.strip() #Removes formatting marks made by python 
    if line == '~': 
    data.append(tmp) 
    tmp = [] 
    continue 
    else: 
    tmp.append(line) 

Jetzt können Sie alle Daten in einer Liste gespeichert haben, aber man könnte es auch als Klassenobjekt umformatieren einen etwas anderen Algorithmus.

Ich habe bearbeitet nie CSV-Dateien mit Python, aber ich glaube, dass Sie eine Schleife wie diese verwenden können, um die Daten zu addieren:

f2 = open('CSVfileName.csv', 'w') #Can change "w" for other needs i.e "a+" 
for entry in data: 
    for subentry in entry: 
    f2.write(str(subentry) + '\n') #Use '\n' to create a new line 

Aus meiner Kenntnis des CSV, dass Schleife eine einzelne Spalte aller schaffen würde die Daten. Am Ende erinnern sich an die Dateien zu schließen, um die Änderungen zu speichern:

f.close() 
f2.close() 

Sie könnten die beiden Schleifen in eine kombinieren, um Platz zu sparen, sondern aus Gründen der Erklärung habe ich nicht.

3

Mit den Bibliotheken luke :) Ich nehme Ihre Daten gut formatiert. Die meisten realen Daten sind nicht so. Also, hier geht eine Lösung.

>>> content.split('~') 
['\nEngland\nLink: http://imgur.com/foobar.jpg\nCapital: London\n', '\nIceland\nLink: http://imgur.com/foobar2.jpg\nCapital: Reykjavik\n', '\nEngland\nLink: http://imgur.com/foobar.jpg\nCapital: London\n', '\nIceland\nLink: http://imgur.com/foobar2.jpg\nCapital: Reykjavik\n'] 

Für die CSV-Schreiben hat Python-Standardbibliothek Funktionen.

>>> import csv 
>>> csvfile = open('foo.csv', 'wb') 
>>> fieldnames = ['Country', 'Link', 'Capital'] 
>>> writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 
>>> for entry in entries: 
... cols = entry.strip().splitlines() 
... writer.writerow({'Country': cols[0], 'Link':cols[1].split(': ')[1], 'Capital':cols[2].split(':')[1]}) 
... 

Wenn Ihre Daten mehr semi-strukturierte oder falsch formatiert sind, sollten Sie eine Bibliothek wie PyParsing verwenden.

Bearbeiten: Zweite Spalte enthält URLs, so müssen wir die Spaltungen gut behandeln.

>>> cols[1] 
'Link: http://imgur.com/foobar2.jpg' 
>>> cols[1].split(':')[1] 
' http' 
>>> cols[1].split(': ')[1] 
'http://imgur.com/foobar2.jpg' 
Verwandte Themen