2016-06-13 4 views
0

eine einfache CSV-Datei wie folgt gegeben:Python und CSV; Wie schneidet man alle Werte in einer Spalte ab?

Django,Gunslinger,101-707 
KingSchultz,Dentist,205-707 
Tatum,Marshall,615-707 
Broomhilda,Wife,910-707 
...,...,... 

Wie Sie alle Werte in der letzten Spalte gestutzt, so dass nur die ersten drei Ziffern bleiben? (Nicht verwandt: so können sie in mathematischen Operationen verwendet werden)

Wunsch CSV:

Django,Gunslinger,101 
KingSchultz,Dentist,205 
Tatum,Marshall,615 
Broomhilda,Wife,910 
...,...,... 

Hier ist, was ich bisher versucht:

import csv 
import re 
r = csv.reader(open(input.csv)) 
for row in r: 
    re.sub('\-.*', '', row[3]) 
writer = csv.writer(open('output.csv', 'w')) 
writer.writerow(row) 

ich die regex in re.sub prüft haben funktioniert richtig. Habe Dutzende von Varianten probiert, viele Stunden lang gesucht, aber nicht die gewünschte Ausgabe bekommen.

Antwort

0

Ohne Verwendung re Modul

import csv 

r = csv.reader(open("sample.csv", "rb")) 
writer = csv.writer(open("output.csv", "wb")) 

for row in r: 
    row[2] = row[2][:3] 
    writer.writerow(row) 

Wie @TigerRedMike wies darauf hin, in Python 3.X, statt 'rb' und: richtig zu arbeiten (python3)

Hier Ihren Code geändert 'wb', 'r' und 'w' sollten jeweils zum Lesen und Schreiben der Dateien verwendet werden.

+0

Getestet Arbeiten an Python 2.7.6 und 3.4.3. Danke @ praba230890. Ich habe die Antwort so bearbeitet, dass sie einen einfachen Fehler enthält, der eine andere Person in Python 3.4.3 verwirren könnte. – TigerRedMike

+0

Können Sie die Syntax von '[: 3]' erklären? – TigerRedMike

+0

Es ist das Schneiden von Schnitten, [: 3] schneidet die ersten 3 Zeichen einer Zeichenkette und gibt sie zurück. Überprüfen Sie dies https://docs.python.org/3/tutorial/introduction.html#strings – praba230890

0

re.sub gibt die Zeichenfolge mit der Ersetzung zurück. es hat keinen Einfluss auf das dritte Argument selbst

0

Das erste, was re.sub gibt einen neuen Wert zurück, es ersetzt nicht den Wert in der Zeile.

zweitens row ist eine laufende Variable, sollten Sie dies innerhalb der Schleife behandeln.

import csv 
import re 
r = csv.reader(open('.../test.csv')) 
with open('.../test2.csv', 'w') as csvfile: 
    writer = csv.writer(csvfile, delimiter=',') 
    for row in r: 
     row[2] = re.sub('\-.*', '', row[2]) 
     writer.writerow(row) 
+0

Getestet Arbeiten an Python 2.7.6 und 3.4.3. Danke @DomTomCat. Da diese Antwort reguläre Ausdrücke verwendet, werden komplexe Änderungen bearbeitet. – TigerRedMike

+0

[Vorzeitige Optimierung ist die Wurzel allen Übels - DonaldKnuth] (http://c2.com/cgi/wiki?PrematureOptimization) – praba230890

0
import csv 
import re 

r = csv.reader(open('input.csv')) 
writer = csv.writer(open('/tmp/output.csv', 'w')) 

for row in r: 
    tmp = re.sub('\-.*', '', row) 
    writer.writerow(tmp) 
+0

Geben Sie bitte eine Erklärung zu Ihrem Code. – runDOSrun

Verwandte Themen