csv — CSV-Datei lesen und schreiben

Quellcode: Lib/csv.py


Das sogenannte CSV-Format (Comma Separated Values) ist das gebräuchlichste Import- und Exportformat für Tabellenkalkulationen und Datenbanken. Das CSV-Format wurde viele Jahre lang verwendet, bevor versucht wurde, das Format in einem standardisierten Weg in RFC 4180 zu beschreiben. Das Fehlen eines klar definierten Standards bedeutet, dass es oft subtile Unterschiede in den von verschiedenen Anwendungen produzierten und verarbeiteten Daten gibt. Diese Unterschiede können die Verarbeitung von CSV-Dateien aus mehreren Quellen lästig machen. Dennoch, obwohl sich die Trennzeichen und Anführungszeichen unterscheiden, ist das Gesamtformat ähnlich genug, dass es möglich ist, ein einziges Modul zu schreiben, das solche Daten effizient manipulieren kann, und die Details des Lesens und Schreibens von Daten für den Programmierer verbirgt.

Das Modul csv implementiert Klassen zum Lesen und Schreiben von Tabellendaten im CSV-Format. Es ermöglicht Programmierern zu sagen: „Schreibe diese Daten in dem von Excel bevorzugten Format“ oder „Lese Daten aus dieser Datei, die von Excel generiert wurde“, ohne die genauen Details des von Excel verwendeten CSV-Formats zu kennen. Programmierer können auch die CSV-Formate beschreiben, die von anderen Anwendungen verstanden werden, oder ihre eigenen spezialisierten CSV-Formate definieren.

Die Objekte reader und writer des Moduls csv lesen und schreiben Sequenzen. Programmierer können Daten auch in Wörterbuchform mit den Klassen DictReader und DictWriter lesen und schreiben.

Siehe auch

PEP 305 - CSV File API

Der Python Enhancement Proposal, der diese Ergänzung zu Python vorschlug.

Modulinhalt

Das Modul csv definiert die folgenden Funktionen

csv.reader(csvfile, /, dialect='excel', **fmtparams)

Gibt ein reader-Objekt zurück, das Zeilen aus der gegebenen csvfile verarbeitet. Eine csvfile muss ein iterierbares Objekt von Strings sein, die jeweils im definierten CSV-Format des Readers enthalten sind. Eine csvfile ist meist ein dateiähnliches Objekt oder eine Liste. Wenn csvfile ein Dateiobjekt ist, sollte es mit newline='' geöffnet werden. [1] Ein optionaler Parameter dialect kann angegeben werden, der zur Definition einer Reihe von Parametern für einen bestimmten CSV-Dialekt verwendet wird. Er kann eine Instanz einer Unterklasse der Klasse Dialect oder einer der Zeichenketten sein, die von der Funktion list_dialects() zurückgegeben werden. Die anderen optionalen Schlüsselwortargumente fmtparams können zur Überschreibung einzelner Formatierungsparameter im aktuellen Dialekt angegeben werden. Ausführliche Informationen zu Dialekt und Formatierungsparametern finden Sie in Abschnitt Dialekte und Formatierungsparameter.

Jede aus der CSV-Datei gelesene Zeile wird als Liste von Strings zurückgegeben. Es erfolgt keine automatische Datentypkonvertierung, es sei denn, die Formatierungsoption QUOTE_NONNUMERIC ist angegeben (in diesem Fall werden unquoted Felder in Floats umgewandelt).

Ein kurzes Anwendungsbeispiel

>>> import csv
>>> with open('eggs.csv', newline='') as csvfile:
...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
...     for row in spamreader:
...         print(', '.join(row))
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam
csv.writer(csvfile, /, dialect='excel', **fmtparams)

Gibt ein Writer-Objekt zurück, das für die Konvertierung der Benutzereingaben in getrennte Zeichenketten in dem angegebenen dateiähnlichen Objekt verantwortlich ist. csvfile kann jedes Objekt mit einer write()-Methode sein. Wenn csvfile ein Dateiobjekt ist, sollte es mit newline='' geöffnet werden [1]. Ein optionaler Parameter dialect kann angegeben werden, der zur Definition einer Reihe von Parametern für einen bestimmten CSV-Dialekt verwendet wird. Er kann eine Instanz einer Unterklasse der Klasse Dialect oder einer der Zeichenketten sein, die von der Funktion list_dialects() zurückgegeben werden. Die anderen optionalen Schlüsselwortargumente fmtparams können zur Überschreibung einzelner Formatierungsparameter im aktuellen Dialekt angegeben werden. Ausführliche Informationen zu Dialekten und Formatierungsparametern finden Sie im Abschnitt Dialekte und Formatierungsparameter. Um die Schnittstelle zu Modulen, die die DB API implementieren, so einfach wie möglich zu gestalten, wird der Wert None als leere Zeichenkette geschrieben. Obwohl dies keine umkehrbare Transformation ist, erleichtert es das Ausgeben von SQL NULL-Datenwerten in CSV-Dateien, ohne die von einem cursor.fetch*-Aufruf zurückgegebenen Daten vorverarbeiten zu müssen. Alle anderen Nicht-String-Daten werden vor dem Schreiben mit str() in Strings umgewandelt.

Ein kurzes Anwendungsbeispiel

import csv
with open('eggs.csv', 'w', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
csv.register_dialect(name, /, dialect='excel', **fmtparams)

Ordnet dialect name zu. name muss eine Zeichenkette sein. Der Dialekt kann entweder durch Übergabe einer Unterklasse von Dialect oder durch Schlüsselwortargumente fmtparams oder beides angegeben werden, wobei Schlüsselwortargumente die Parameter des Dialekts überschreiben. Ausführliche Informationen zu Dialekten und Formatierungsparametern finden Sie in Abschnitt Dialekte und Formatierungsparameter.

csv.unregister_dialect(name)

Löscht den mit name assoziierten Dialekt aus dem Dialekt-Registry. Ein Error wird ausgelöst, wenn name kein registrierter Dialektname ist.

csv.get_dialect(name)

Gibt den mit name assoziierten Dialekt zurück. Ein Error wird ausgelöst, wenn name kein registrierter Dialektname ist. Diese Funktion gibt einen unveränderlichen Dialect zurück.

csv.list_dialects()

Gibt die Namen aller registrierten Dialekte zurück.

csv.field_size_limit()
csv.field_size_limit(new_limit)

Gibt die aktuell vom Parser zugelassene maximale Feldgröße zurück. Wenn new_limit angegeben wird, wird dies zur neuen Grenze.

Das Modul csv definiert die folgenden Klassen

class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

Erstellt ein Objekt, das wie ein normaler Reader funktioniert, aber die Informationen in jeder Zeile einer dict zuordnet, deren Schlüssel durch den optionalen Parameter fieldnames gegeben sind.

Der Parameter fieldnames ist eine Sequenz. Wenn fieldnames weggelassen wird, werden die Werte in der ersten Zeile der Datei f als Feldnamen verwendet und aus den Ergebnissen weggelassen. Wenn fieldnames angegeben ist, werden diese verwendet und die erste Zeile wird in die Ergebnisse aufgenommen. Unabhängig davon, wie die Feldnamen ermittelt werden, behält das Wörterbuch ihre ursprüngliche Reihenfolge bei.

Wenn eine Zeile mehr Felder als Feldnamen hat, werden die verbleibenden Daten in einer Liste gesammelt und unter dem Feldnamen gespeichert, der durch restkey angegeben wird (standardmäßig None). Wenn eine nicht leere Zeile weniger Felder als Feldnamen hat, werden die fehlenden Werte mit dem Wert von restval gefüllt (standardmäßig None).

Alle anderen optionalen oder Schlüsselwortargumente werden an die zugrunde liegende Instanz von reader übergeben.

Wenn das an fieldnames übergebene Argument ein Iterator ist, wird es in eine list umgewandelt.

Geändert in Version 3.6: Zurückgegebene Zeilen sind nun vom Typ OrderedDict.

Geändert in Version 3.8: Zurückgegebene Zeilen sind nun vom Typ dict.

Ein kurzes Anwendungsbeispiel

>>> import csv
>>> with open('names.csv', newline='') as csvfile:
...     reader = csv.DictReader(csvfile)
...     for row in reader:
...         print(row['first_name'], row['last_name'])
...
Eric Idle
John Cleese

>>> print(row)
{'first_name': 'John', 'last_name': 'Cleese'}
class csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)

Erstellt ein Objekt, das wie ein normaler Writer funktioniert, aber Dictionaries auf Ausgabezeilen abbildet. Der Parameter fieldnames ist eine Sequenz von Schlüsseln, die die Reihenfolge identifizieren, in der Werte im Dictionary, das an die Methode writerow() übergeben wird, in die Datei f geschrieben werden. Der optionale Parameter restval gibt den Wert an, der geschrieben werden soll, wenn im Dictionary ein Schlüssel fehlt, der nicht in fieldnames enthalten ist. Wenn das an die Methode writerow() übergebene Dictionary einen Schlüssel enthält, der nicht in fieldnames gefunden wird, gibt der optionale Parameter extrasaction an, welche Aktion ausgeführt werden soll. Wenn er auf 'raise' gesetzt ist, dem Standardwert, wird ein ValueError ausgelöst. Wenn er auf 'ignore' gesetzt ist, werden zusätzliche Werte im Dictionary ignoriert. Alle anderen optionalen oder Schlüsselwortargumente werden an die zugrunde liegende Instanz von writer übergeben.

Beachten Sie, dass der Parameter fieldnames der Klasse DictWriter, im Gegensatz zur Klasse DictReader, nicht optional ist.

Wenn das an fieldnames übergebene Argument ein Iterator ist, wird es in eine list umgewandelt.

Ein kurzes Anwendungsbeispiel

import csv

with open('names.csv', 'w', newline='') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
class csv.Dialect

Die Klasse Dialect ist eine Containerklasse, deren Attribute Informationen darüber enthalten, wie Doppel-Anführungszeichen, Leerzeichen, Trennzeichen usw. behandelt werden. Aufgrund des Fehlens einer strengen CSV-Spezifikation erzeugen verschiedene Anwendungen subtil unterschiedliche CSV-Daten. Instanzen von Dialect definieren, wie sich die Instanzen von reader und writer verhalten.

Alle verfügbaren Namen von Dialect werden von list_dialects() zurückgegeben, und sie können mit spezifischen reader- und writer-Klassen über ihre Initialisierungsfunktionen (__init__) wie folgt registriert werden:

import csv

with open('students.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, dialect='unix')
class csv.excel

Die Klasse excel definiert die üblichen Eigenschaften einer von Excel generierten CSV-Datei. Sie ist unter dem Dialektnamen 'excel' registriert.

class csv.excel_tab

Die Klasse excel_tab definiert die üblichen Eigenschaften einer von Excel generierten TAB-getrennten Datei. Sie ist unter dem Dialektnamen 'excel-tab' registriert.

class csv.unix_dialect

Die Klasse unix_dialect definiert die üblichen Eigenschaften einer unter UNIX-Systemen generierten CSV-Datei, d. h. mit '\n' als Zeilenabschluss und Anführungszeichen für alle Felder. Sie ist unter dem Dialektnamen 'unix' registriert.

Hinzugefügt in Version 3.2.

class csv.Sniffer

Die Klasse Sniffer wird verwendet, um das Format einer CSV-Datei zu ermitteln.

Die Klasse Sniffer bietet zwei Methoden

sniff(sample, delimiters=None)

Analysiert die gegebene sample und gibt eine Unterklasse von Dialect zurück, die die gefundenen Parameter widerspiegelt. Wenn der optionale Parameter delimiters angegeben wird, wird er als Zeichenkette interpretiert, die mögliche gültige Trennzeichenzeichen enthält.

has_header(sample)

Analysiert den Beispieltext (vermutlich im CSV-Format) und gibt True zurück, wenn die erste Zeile eine Reihe von Spaltenüberschriften zu sein scheint. Bei der Inspektion jeder Spalte werden ein oder zwei Hauptkriterien verwendet, um abzuschätzen, ob die Stichprobe eine Kopfzeile enthält

  • die zweite bis n-te Zeile enthält numerische Werte

  • die zweite bis n-te Zeile enthält Zeichenketten, bei denen mindestens die Länge eines Wertes von der des potenziellen Headers dieser Spalte abweicht.

Zwanzig Zeilen nach der ersten Zeile werden beprobt; wenn mehr als die Hälfte der Spalten + Zeilen die Kriterien erfüllt, wird True zurückgegeben.

Hinweis

Diese Methode ist eine grobe Heuristik und kann sowohl Falsch-Positiv- als auch Falsch-Negativ-Ergebnisse liefern.

Ein Beispiel für die Verwendung von Sniffer

with open('example.csv', newline='') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... process CSV file contents here ...

Das Modul csv definiert die folgenden Konstanten

csv.QUOTE_ALL

Weist writer-Objekten an, alle Felder in Anführungszeichen zu setzen.

csv.QUOTE_MINIMAL

Weist writer-Objekten an, nur die Felder in Anführungszeichen zu setzen, die Sonderzeichen wie delimiter, quotechar, '\r', '\n' oder eines der Zeichen in lineterminator enthalten.

csv.QUOTE_NONNUMERIC

Weist writer-Objekten an, alle nicht-numerischen Felder in Anführungszeichen zu setzen.

Weist reader-Objekten an, alle unquoted Felder in den Typ float zu konvertieren.

Hinweis

Einige numerische Typen, wie z. B. bool, Fraction oder IntEnum, haben eine Zeichenstellendarstellung, die nicht in float konvertiert werden kann. Sie können nicht in den Modi QUOTE_NONNUMERIC und QUOTE_STRINGS gelesen werden.

csv.QUOTE_NONE

Weist writer-Objekten an, niemals Felder in Anführungszeichen zu setzen. Wenn der aktuelle delimiter, quotechar, escapechar, '\r', '\n' oder eines der Zeichen in lineterminator in den Ausgabedaten vorkommt, wird ihm das aktuelle escapechar-Zeichen vorangestellt. Wenn escapechar nicht gesetzt ist, löst der Writer einen Error aus, wenn Zeichen angetroffen werden, die maskiert werden müssen. Setzen Sie quotechar auf None, um dessen Maskierung zu verhindern.

Weist reader-Objekten an, keine spezielle Verarbeitung von Anführungszeichen durchzuführen.

csv.QUOTE_NOTNULL

Weist writer-Objekten an, alle Felder in Anführungszeichen zu setzen, die nicht None sind. Dies ähnelt QUOTE_ALL, außer dass bei einem Feldwert None eine leere (unquoted) Zeichenkette geschrieben wird.

Weist reader-Objekten an, ein leeres (unquoted) Feld als None zu interpretieren und sich ansonsten wie QUOTE_ALL zu verhalten.

Hinzugefügt in Version 3.12.

csv.QUOTE_STRINGS

Weist writer-Objekten an, Felder, die Zeichenketten sind, immer in Anführungszeichen zu setzen. Dies ähnelt QUOTE_NONNUMERIC, außer dass bei einem Feldwert None eine leere (unquoted) Zeichenkette geschrieben wird.

Weist reader-Objekten an, eine leere (unquoted) Zeichenkette als None zu interpretieren und sich ansonsten wie QUOTE_NONNUMERIC zu verhalten.

Hinzugefügt in Version 3.12.

Das Modul csv definiert die folgende Ausnahme

exception csv.Error

Wird von jeder der Funktionen ausgelöst, wenn ein Fehler erkannt wird.

Dialekte und Formatierungsparameter

Um die Angabe des Formats von Eingabe- und Ausgabesätzen zu erleichtern, werden bestimmte Formatierungsparameter zu Dialekten zusammengefasst. Ein Dialekt ist eine Unterklasse der Klasse Dialect, die verschiedene Attribute enthält, die das Format der CSV-Datei beschreiben. Beim Erstellen von Objekten vom Typ reader oder writer kann der Programmierer eine Zeichenkette oder eine Unterklasse der Klasse Dialect als Parameter dialect angeben. Zusätzlich zu, oder anstelle von, dem Parameter dialect kann der Programmierer auch einzelne Formatierungsparameter angeben, die dieselben Namen haben wie die unten für die Klasse Dialect definierten Attribute.

Dialekte unterstützen die folgenden Attribute

Dialect.delimiter

Eine ein Zeichen lange Zeichenkette, die zur Trennung von Feldern verwendet wird. Standardmäßig ist sie ','.

Dialect.doublequote

Steuert, wie Instanzen von quotechar, die innerhalb eines Feldes vorkommen, selbst zitiert werden sollen. Wenn True, wird das Zeichen verdoppelt. Wenn False, wird escapechar als Präfix für quotechar verwendet. Der Standardwert ist True.

Beim Ausgeben wird, wenn doublequote False ist und kein escapechar gesetzt ist, Error ausgelöst, wenn ein quotechar in einem Feld gefunden wird.

Dialect.escapechar

Ein einzeicheniger String, der vom Writer verwendet wird, um Zeichen zu escapen, die ein Escaping erfordern

  • der delimiter, das quotechar, '\r', '\n' und alle Zeichen in lineterminator werden escapet, wenn quoting auf QUOTE_NONE gesetzt ist;

  • das quotechar wird escapet, wenn doublequote False ist;

  • das escapechar selbst.

Beim Lesen entfernt das escapechar jegliche Sonderbedeutung vom folgenden Zeichen. Der Standardwert ist None, was das Escaping deaktiviert.

Geändert in Version 3.11: Ein leeres escapechar ist nicht erlaubt.

Dialect.lineterminator

Der String, der zum Beenden von Zeilen verwendet wird, die vom writer erzeugt werden. Der Standardwert ist '\r\n'.

Hinweis

Der reader ist hartkodiert, um entweder '\r' oder '\n' als Zeilenende zu erkennen und ignoriert lineterminator. Dieses Verhalten kann sich in Zukunft ändern.

Dialect.quotechar

Ein einzeicheniger String, der zum Zitieren von Feldern verwendet wird, die Sonderzeichen wie delimiter oder quotechar enthalten oder die Zeilenumbruchzeichen ('\r', '\n' oder beliebige Zeichen in lineterminator) enthalten. Der Standardwert ist '"'. Kann auf None gesetzt werden, um das Escaping von '"' zu verhindern, wenn quoting auf QUOTE_NONE gesetzt ist.

Geändert in Version 3.11: Ein leeres quotechar ist nicht erlaubt.

Dialect.quoting

Steuert, wann Zitate vom Writer generiert und vom Reader erkannt werden sollen. Es kann einen der QUOTE_* Konstanten annehmen und hat standardmäßig QUOTE_MINIMAL, wenn quotechar nicht None ist, und QUOTE_NONE, andernfalls.

Dialect.skipinitialspace

Wenn True, werden Leerzeichen unmittelbar nach dem delimiter ignoriert. Der Standardwert ist False. Wenn delimiter=' ' mit skipinitialspace=True kombiniert wird, sind unzitierte leere Felder nicht erlaubt.

Dialect.strict

Wenn True, wird die Ausnahme Error bei fehlerhaften CSV-Eingaben ausgelöst. Der Standardwert ist False.

Reader-Objekte

Reader-Objekte (DictReader-Instanzen und von der Funktion reader() zurückgegebene Objekte) haben die folgenden öffentlichen Methoden.

csvreader.__next__()

Gibt die nächste Zeile des iterierbaren Objekts des Readers als Liste (wenn das Objekt von reader() zurückgegeben wurde) oder als Dictionary (wenn es sich um eine DictReader-Instanz handelt) zurück, geparst gemäß dem aktuellen Dialect. Normalerweise sollte dies als next(reader) aufgerufen werden.

Reader-Objekte haben die folgenden öffentlichen Attribute.

csvreader.dialect

Eine schreibgeschützte Beschreibung des vom Parser verwendeten Dialekts.

csvreader.line_num

Die Anzahl der aus der Quell-Iterator gelesenen Zeilen. Dies ist nicht dasselbe wie die Anzahl der zurückgegebenen Datensätze, da Datensätze mehrere Zeilen umfassen können.

DictReader-Objekte haben das folgende öffentliche Attribut.

DictReader.fieldnames

Wenn beim Erstellen des Objekts nicht als Parameter übergeben, wird dieses Attribut beim ersten Zugriff oder beim Lesen des ersten Datensatzes aus der Datei initialisiert.

Writer-Objekte

writer-Objekte (DictWriter-Instanzen und von der Funktion writer() zurückgegebene Objekte) haben die folgenden öffentlichen Methoden. Eine Zeile muss ein iterierbares Objekt aus Strings oder Zahlen sein für writer-Objekte und ein Dictionary, das Feldnamen auf Strings oder Zahlen abbildet (indem sie zuerst durch str() geleitet werden) für DictWriter-Objekte. Beachten Sie, dass komplexe Zahlen in Klammern geschrieben werden. Dies kann zu Problemen bei anderen Programmen führen, die CSV-Dateien lesen (vorausgesetzt, sie unterstützen überhaupt komplexe Zahlen).

csvwriter.writerow(row, /)

Schreibt den row-Parameter in das Dateiobjekt des Writers, formatiert gemäß dem aktuellen Dialect. Gibt den Rückgabewert des Aufrufs der write-Methode des zugrunde liegenden Dateiobjekts zurück.

Geändert in Version 3.5: Unterstützung für beliebige Iterables hinzugefügt.

csvwriter.writerows(rows, /)

Schreibt alle Elemente in rows (ein iterierbares Objekt von row-Objekten wie oben beschrieben) in das Dateiobjekt des Writers, formatiert gemäß dem aktuellen Dialekt.

Writer-Objekte haben das folgende öffentliche Attribut.

csvwriter.dialect

Eine schreibgeschützte Beschreibung des vom Writer verwendeten Dialekts.

DictWriter-Objekte haben die folgende öffentliche Methode.

DictWriter.writeheader()

Schreibt eine Zeile mit den Feldnamen (wie im Konstruktor angegeben) in das Dateiobjekt des Writers, formatiert gemäß dem aktuellen Dialekt. Gibt den Rückgabewert des intern verwendeten Aufrufs von csvwriter.writerow() zurück.

Hinzugefügt in Version 3.2.

Geändert in Version 3.8: writeheader() gibt nun auch den Wert zurück, der von der Methode csvwriter.writerow() zurückgegeben wird, die sie intern verwendet.

Beispiele

Das einfachste Beispiel zum Lesen einer CSV-Datei.

import csv
with open('some.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

Lesen einer Datei mit einem alternativen Format.

import csv
with open('passwd', newline='') as f:
    reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
    for row in reader:
        print(row)

Das entsprechende einfachste Schreibbeispiel ist

import csv
with open('some.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(someiterable)

Da open() zum Öffnen einer CSV-Datei zum Lesen verwendet wird, wird die Datei standardmäßig mit der systemweiten Standardkodierung in Unicode dekodiert (siehe locale.getencoding()). Um eine Datei mit einer anderen Kodierung zu dekodieren, verwenden Sie das Argument encoding von open.

import csv
with open('some.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

Dasselbe gilt für das Schreiben in einer anderen Kodierung als der systemweiten Standardkodierung: Geben Sie das Argument encoding beim Öffnen der Ausgabedatei an.

Registrieren eines neuen Dialekts.

import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='') as f:
    reader = csv.reader(f, 'unixpwd')

Eine etwas fortgeschrittenere Verwendung des Readers – Erfassen und Melden von Fehlern.

import csv, sys
filename = 'some.csv'
with open(filename, newline='') as f:
    reader = csv.reader(f)
    try:
        for row in reader:
            print(row)
    except csv.Error as e:
        sys.exit(f'file {filename}, line {reader.line_num}: {e}')

Und obwohl das Modul das Parsen von Strings nicht direkt unterstützt, kann es einfach gemacht werden.

import csv
for row in csv.reader(['one,two,three']):
    print(row)

Fußnoten