Seite 1 von 1

csv lineterminator

Verfasst: Montag 9. Mai 2011, 10:39
von Rekrul
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]

Re: csv lineterminator

Verfasst: Montag 9. Mai 2011, 15:34
von Rekrul
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)