ubuntuusers.de

Python Erstzen mit sub

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.10 (Yakkety Yak)
Antworten |

Standard1988

Anmeldungsdatum:
28. Dezember 2010

Beiträge: 87

Hallo Zusammen,

ich lese z.B. folgendes ein:

01.02.17,28.02.17,28,Versicherung,"-367,84","-13,14",Monatlich

und möchte nun gerne aus dem "," ein ";" machen außer natürlich bei den Beträgen.

Ich bekommen es weder mit replace noch mit sub hin.

re.sub(r',',';', zeile)

Hat jemand eine Idee?

LG Standard

Bearbeitet von sebix:

Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

Standard1988 schrieb:

re.sub(r',',';', zeile)

So geht das nicht, weil dieser Ausdruck nicht erkennen kann, ob das Komma in einem Feldwert (also innerhalt doppelter Anführungsstriche) oder als Feldbegrenzer auftritt. Dafür brauchst Du mehr Kontext.

Hat jemand eine Idee?

Das einfachste ist, die Zeile mit einem CSV-Parser zu parsen und dann mit neuen Trennern zu schreiben. Man kann sich auch mit einem geeigneten Regulären Ausdruck behelfen:

1
2
>>> ";".join(re.findall('"[^"]*"|[^,]+', '01.02.17,28.02.17,28,Versicherung,"-367,84","-13,14",Monatlich'))
'01.02.17;28.02.17;28;Versicherung;"-367,84";"-13,14";Monatlich'

Axel-Erfurt

Anmeldungsdatum:
18. Mai 2016

Beiträge: 1347

so würde es auch gehen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/usr/bin/python
# -- coding: utf-8 --

from csv import reader
text = []
infile = ['01.02.17,28.02.17,28,Versicherung,"-367,84","-13,14",Monatlich']
for line in reader(infile, delimiter = ","):
    for nline in line:
        text.append(nline)
    
print(";".join(text))

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

Ich wuerde auch das csv-Modul zum parsen und schreiben verwenden, da es alle Spezialfaelle beachtet, die vorkommen koennen: https://docs.python.org/3.5/library/csv.html

DictReader und DictWriter finde ich ganz angenehm, weiters musst du den Dialekt bzw delimiter fuer den output entsprechend deinen Beduerfnissen setzten.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

Axel-Erfurt schrieb:

so würde es auch gehen

Der Ansatz funktioniert nicht mit mehreren Zeilen. Das kann man aber einfach reparieren - und dann wird es auch noch kürzer, weil append hier überflüssig ist:

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
# -- coding: utf-8 --

from csv import reader

infile = ['01.02.17,28.02.17,28,Versicherung,"-367,84","-13,14",Monatlich', '1,2,3,4,5,6,7']

for line in reader(infile, delimiter = ","):
    print(";".join(line))

Außerdem verstehe ich nicht, warum Du nicht auch gleich den csv.writer benutzt, wenn Du schon den reader nimmst. Das sorgt dann auch für ordentliches Quoting:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/usr/bin/python
# -- coding: utf-8 --

import csv
import sys

infile = ['01.02.17,28.02.17,28,Versicherung,"-367,84","-13,14",Monatlich', '1,2,3;3,4,5,6,7']
out = csv.writer(sys.stdout, delimiter = ';')

for line in csv.reader(infile, delimiter = ","):
    out.writerow(line)
Antworten |