2016-05-10 27 views
1

Ich habe die folgende .py-Datei für eine CSV-Datei mit einer Anzahl von Spalten und Tausenden von Datenzeilen entwickelt. Hier ist das Skript, das ich bisher habe:CSV-Spalte teilen & sortieren In alphabetischer Reihenfolge

infile = open("titanic.csv", "rU") 
incsv = csv.reader(infile, delimiter = ',') 
outfile = open("titanicOutput.csv", "w") 
outcsv = csv.writer(outfile, delimiter = ',') 
header = incsv.next() 

rowNum = 0 
for row in incsv: 
(data1, data2, namedata, data4, data5, data6, data7, data8, data9, data10, data11) = row 
if '1' in data1: 
    rowOutput = [namedata, data2, data4, data5] 
    outcsv.writerow(rowOutput) 
    rowNum += 1 

infile.close() 
outfile.close() 

Grundsätzlich ist die Information von namedata Spalte für everyones vollständigen Namen präsentiert wird wie dieser „Smith, John“. Auf den Nachnamen folgt zuerst der Vorname. Ich muss Nachname und Vorname trennen und eine Spalte für jedes in der Ausgabe erstellen - ohne Komma oder Anführungszeichen, die bereits existieren. Ich muss dann auch die Informationen mit der Spalte Nachname in alphabetischer Reihenfolge darstellen. Ich weiß, dass sort() in irgendeiner Eigenschaft verwendet wird, um alphabetisch zu sortieren, aber die Aufteilung habe ich keine Ahnung.

Ich bin so weit gekommen, habe aber keine Idee, wie ich die Namedata-Spalte aufteilen soll - es gab eine Erklärung hier, die ich für ein ähnliches Problem gelesen habe, aber es war zu komplex für mich, um ehrlich zu verstehen. Die gedämpfte Erklärung wäre toll, danke!

EDIT: Original File Data (Simplified version for illustration) - 
data1 data2 namedata    data4 data5 
0   3  Smith, Mr John   m  22 
1   1  McMahan, Ms Sally  f  38 
1   3  Emmit, Mr Brandon  f  26 

Output csv File (Simplified version for illustration) - 
lastname firstname  data2 data4 
Emmit  Mr Brandon  3  m 
McMahon  Ms Sally   1  f 
Smith  Mr John   3  f 

Hoffe, dass hilft!

+0

Absolut, das könnte eine wirklich dumme Frage sein, aber wie kann ich Dateien an diesen Beitrag anhängen? – lonewolf2288

+0

Danke, fertig! Ich hoffe, das hilft. – lonewolf2288

Antwort

0

Sie können die Daten teilen den entsprechend benannten .split Methode von Strings, wie folgt aus:

>>> namedata = 'Smith, John' 
>>> last,first = namedata.split(',') 
>>> last 
'Smith' 
>>> first 
' John' 

Sie auch brauchen nicht die rowNum Tracker (Sie es nicht scheinen überall zu verwenden). Versuchen Sie diese Version:

import csv 

rows = [] 
with open("titanic.csv", "rU") as infile: 
    reader = csv.reader(infile, delimiter=',') 
    next(reader) 
    for row in reader: 
     last,first = row[2].split(',') 
     rows.append([last, first, row[1], row[3], row[4]]) 

# Sort the rows by last name 
sorted_rows = sorted(rows, key=lamdba x: x[0]) 

with open("titanicOutput.csv", "w") as outfile: 
    writer = csv.writer(outfile, delimiter=',') 
    writer.writerows(sorted_rows) 

print('Done') 

Python kann die meisten Dinge sortieren. Zum Beispiel, wenn Sie ihm eine Liste mit Namen übergeben, weiß er, wie in alphabetischer Reihenfolge sortieren:

>>> names = ['Zack', 'John', 'David'] 
>>> sorted(names) 
['David', 'John', 'Zack'] 

Sie können auch in umgekehrter Reihenfolge sortieren sagen:

>>> sorted(names, reverse=True) 
['Zack', 'John', 'David'] 

Dies funktioniert gut für einfache Listen In Ihrem Fall haben Sie jedoch eine Liste mit Listen, also müssen Sie Python mitteilen, was beim Sortieren zu verwenden ist.

Dies ist, was das Schlüssel Argument ist. Sie übergeben diesem Argument eine Funktion, die das Objekt zurückgibt, nach dem Sie sortieren möchten. Diese Funktion wird mit jedem Element in der Liste aufgerufen und sollte die Sache zurückgeben, die Python zum Sortieren verwendet.

In unserem Fall möchten wir nach dem Nachnamen sortieren, der der erste Eintrag für jede Liste in unserer Liste ist.

Unsere Daten sieht wie folgt aus:

[['John', 'Smith', 1, 3, 4], ['Avery', 'Jones', 1, 3, 4]] 

Wir durch den ersten Wert jeder inneren Liste sortiert werden soll (das ist der letzte Name ist). Die Funktion, die wir schreiben, wird jedes Element übergeben werden (Liste), so müssen wir nur das erste Element zurück:

def sort_by(item): 
    return item[0] 

sorted(names, key=sort_by) 

Nun wie wir sortiert Werke wollen:

>>> names = [['John', 'Smith', 1, 3, 4], ['Avery', 'Jones', 1, 3, 4]] 
>>> def sort_by(item): 
... return item[0] 
... 
>>> sorted(names, key=sort_by) 
[['Avery', 'Jones', 1, 3, 4], ['John', 'Smith', 1, 3, 4]] 

A Lambda ist nur eine Abkürzung, um eine Funktion zu schreiben.Da wir die sort_by Methode wahrscheinlich nirgendwo anders als für die Zwecke der Sortierung verwenden werden, müssen wir sie nicht wirklich definieren. Wir können es einfach in einen Lambda-Transformation und gibt sie direkt an:

>>> sorted(names, key=lambda item: item[0]) 
[['Avery', 'Jones', 1, 3, 4], ['John', 'Smith', 1, 3, 4]] 
0

Wenn ich richtig verstehe, haben Sie ein Feld wie:

name = "Smith, John" 

Aber Sie wollen eine Liste wie:

["John", "Smith"] 

Dafür könnten Sie etwas tun:

first_last = names.split(', ') 
first_last.reverse() 
print first_last 

Für Sortierung, ist es verpflichtet, viele Möglichkeiten, und dies ist vielleicht nicht die eleganteste sein, aber man konnte eine dict, sortieren Sie die Keyset erstellen und dann die entsprechenden Werte ausdrucken:

phonebook = dict() 

for row in csv: 
    last_name = get_last_name() 
    phonebook[last_name] = row 

lastnames = phonebook.keys() 
lastnames.sort() 
for key in lastnames: 
    print phonebook[key] 

Wo letztere fast aus Großhandel genommen von https://stackoverflow.com/a/13990710/695787. Wahrscheinlich scheitert es jedoch für doppelte Nachnamen.

Verwandte Themen