csv lineterminator

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Hallo,

ich habe *.csv-Dateien, die ich einlesen muss. Funktioniert so weit auch, allerdings kommt es manchmal vor, das gewisse Spalten Kommentare enthalten können, die manchmal auch mehrzeilig sein können. Lasse ich mir die Zeilenenden in einem Editor mit ausgeben sieht das ganze so aus:

Code: Alles auswählen

...
wert;wert;wert;einzeiliges Kommentar;wert;wert CRLF
wert;wert;wert;hier kommt ein CR
mehrzeiliges Kommentar;wert;wert CRLF
...
Nun ist meine Frage, wie ich dem csv-Modul beibringen kann, zwischen diesen Seperatoren zu unterscheiden. Als lineterminator '\r\n' zu verwenden scheint nicht zu funktionieren. Hier ist der von mir verwendete Dialekt:

Code: Alles auswählen

class CsvDialect(csv.dialect):
    quotechar = str('\x07')
    delimiter = str(';')
    lineterminator = str('\r\n')
    doublequote = False
    skipinitialspace = True
    quoting = csv.QUOTE_NONE
    escapechar = str('\\')
Die Methode zum Einlesen der Datei:

Code: Alles auswählen

def read_csv_file(filename):
    with open(filename, 'rb') as csvfile:
        reader = csv.reader(csvfile, CsvDialect())
        return [row for row in reader]
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Aha!
http://docs.python.org/library/csv.html#dialects-and-formatting-parameters hat geschrieben:Note
The reader is hard-coded to recognise either '\r' or '\n' as end-of-line, and ignores lineterminator. This behavior may change in the future.
Workaround:

Code: Alles auswählen

def replaceCRorLF(s):
    """
    Remove all occurences of \r and \n from a string and replace them with a whitespace.
    """
    return ' '.join(' '.join(s.split('\n')).split('\r'))

def records(filename):
    """
    Returns a list of lines.
    """
    with open(filename, 'rb') as f:
        contents = f.read()
        return [replaceCRorLF(record) for record in contents.split('\r\n')]
Csv-Reader erstellen durch:

Code: Alles auswählen

reader = csv.reader(records(filename), dialect)
Antworten