Lesen und Schreiben von CSV-Dateien in Python

Lesen und Schreiben von CSV-Dateien in Python

Seien wir ehrlich: Sie müssen Informationen nicht nur über Tastatur und Konsole in Ihre Programme ein- und aus ihnen herausholen. Das Austauschen von Informationen über Textdateien ist eine übliche Methode, um Informationen zwischen Programmen auszutauschen. Eines der beliebtesten Formate für den Datenaustausch ist das CSV-Format. Aber wie benutzt du es?

Lassen Sie uns eines klarstellen: Sie müssen Ihren eigenen CSV-Parser nicht von Grund auf neu erstellen (und werden es auch nicht tun). Es gibt mehrere vollkommen akzeptable Bibliotheken, die Sie verwenden können. Die Pythoncsv library funktionieren in den meisten Fällen. Wenn Ihre Arbeit viele Daten oder numerische Analysen erfordert, verfügtpandas library auch über CSV-Analysefunktionen, die den Rest erledigen sollten.

In diesem Artikel erfahren Sie, wie Sie CSV aus Textdateien mit Python lesen, verarbeiten und analysieren. Sie werden sehen, wie CSV-Dateien funktionieren, die in Python integrierte Bibliothekcsvund die CSV-Analyse mithilfe der Bibliothekpandaskennenlernen.

Also lasst uns anfangen!

__ Take the Quiz: Testen Sie Ihr Wissen mit unserem interaktiven Quiz „Lesen und Schreiben von CSV-Dateien in Python“. Nach Abschluss erhalten Sie eine Punktzahl, mit der Sie Ihren Lernfortschritt im Laufe der Zeit verfolgen können:

Was ist eine CSV-Datei?

Eine CSV-Datei (Comma Separated Values-Datei) ist eine Art Klartextdatei, die eine bestimmte Strukturierung zum Anordnen von Tabellendaten verwendet. Da es sich um eine Nur-Text-Datei handelt, kann sie nur tatsächliche Textdaten enthalten, dh druckbareASCIIoderUnicodeZeichen.

Die Struktur einer CSV-Datei wird durch ihren Namen verraten. Normalerweise verwenden CSV-Dateien ein Komma, um jeden bestimmten Datenwert zu trennen. So sieht diese Struktur aus:

column 1 name,column 2 name, column 3 name
first row data 1,first row data 2,first row data 3
second row data 1,second row data 2,second row data 3
...

Beachten Sie, wie jedes Datenelement durch ein Komma getrennt ist. Normalerweise identifiziert die erste Zeile jedes Datenelement - mit anderen Worten den Namen einer Datenspalte. Jede nachfolgende Zeile danach sind tatsächliche Daten und wird nur durch Einschränkungen der Dateigröße begrenzt.

Im Allgemeinen wird das Trennzeichen als Trennzeichen bezeichnet, und es wird nicht nur das Komma verwendet. Andere beliebte Trennzeichen sind die Tabulator- ( ), Doppelpunkt- (:) und Semikolon- (;) Zeichen. Um eine CSV-Datei richtig zu analysieren, müssen wir wissen, welches Trennzeichen verwendet wird.

Woher kommen CSV-Dateien?

CSV-Dateien werden normalerweise von Programmen erstellt, die große Datenmengen verarbeiten. Sie sind eine bequeme Möglichkeit, Daten aus Tabellenkalkulationen und Datenbanken zu exportieren sowie zu importieren oder in anderen Programmen zu verwenden. Sie können beispielsweise die Ergebnisse eines Data Mining-Programms in eine CSV-Datei exportieren und diese dann in eine Tabelle importieren, um die Daten zu analysieren, Diagramme für eine Präsentation zu erstellen oder einen Bericht zur Veröffentlichung vorzubereiten.

CSV-Dateien sind sehr einfach programmgesteuert zu bearbeiten. Jede Sprache, die die Eingabe von Textdateien und die Bearbeitung von Zeichenfolgen unterstützt (wie Python), kann direkt mit CSV-Dateien arbeiten.

Analysieren von CSV-Dateien mit der in Python integrierten CSV-Bibliothek

Dascsv library bietet Funktionen zum Lesen und Schreiben in CSV-Dateien. Es wurde entwickelt, um sofort mit Excel-generierten CSV-Dateien zu arbeiten, und kann problemlos an eine Vielzahl von CSV-Formaten angepasst werden. Die Bibliothekcsv enthält Objekte und anderen Code zum Lesen, Schreiben und Verarbeiten von Daten aus und zu CSV-Dateien.

Lesen von CSV-Dateien mitcsv

Das Lesen aus einer CSV-Datei erfolgt mit dem Objektreader. Die CSV-Datei wird als Textdatei mit der in Python integrierten Funktionopen()geöffnet, die ein Dateiobjekt zurückgibt. Dies wird dann anreader übergeben, das das schwere Heben übernimmt.

Hier ist dieemployee_birthday.txt-Datei:

name,department,birthday month
John Smith,Accounting,November
Erica Meyers,IT,March

Hier ist Code zum Lesen:

import csv

with open('employee_birthday.txt') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
        else:
            print(f'\t{row[0]} works in the {row[1]} department, and was born in {row[2]}.')
            line_count += 1
    print(f'Processed {line_count} lines.')

Dies führt zu folgender Ausgabe:

Column names are name, department, birthday month
    John Smith works in the Accounting department, and was born in November.
    Erica Meyers works in the IT department, and was born in March.
Processed 3 lines.

Jede vonreader zurückgegebene Zeile ist eine Liste vonString-Elementen, die die durch Entfernen der Trennzeichen gefundenen Daten enthalten. Die erste zurückgegebene Zeile enthält die Spaltennamen, die auf besondere Weise behandelt werden.

Lesen von CSV-Dateien in ein Wörterbuch mitcsv

Anstatt sich mit einer Liste einzelnerString-Elemente zu befassen, können Sie CSV-Daten auch direkt in ein Wörterbuch (technisch gesehen einOrdered Dictionary) einlesen.

Unsere Eingabedateiemployee_birthday.txt lautet wie folgt:

name,department,birthday month
John Smith,Accounting,November
Erica Meyers,IT,March

Hier ist der Code, um ihn diesmal als Wörterbuch einzulesen:

import csv

with open('employee_birthday.txt', mode='r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
        print(f'\t{row["name"]} works in the {row["department"]} department, and was born in {row["birthday month"]}.')
        line_count += 1
    print(f'Processed {line_count} lines.')

Dies führt zu derselben Ausgabe wie zuvor:

Column names are name, department, birthday month
    John Smith works in the Accounting department, and was born in November.
    Erica Meyers works in the IT department, and was born in March.
Processed 3 lines.

Woher kamen die Wörterbuchschlüssel? Es wird angenommen, dass die erste Zeile der CSV-Datei die Schlüssel enthält, die zum Erstellen des Wörterbuchs verwendet werden sollen. Wenn Sie diese nicht in Ihrer CSV-Datei haben, sollten Sie Ihre eigenen Schlüssel angeben, indem Sie den optionalen Parameterfieldnamesauf eine Liste setzen, die sie enthält.

Optionale Python CSVreader-Parameter

Dasreader-Objekt kann verschiedene Stile von CSV-Dateien verarbeiten, indemadditional parameters angegeben werden, von denen einige unten gezeigt werden:

  • delimiter gibt das Zeichen an, mit dem jedes Feld getrennt wird. Der Standardwert ist das Komma (',').

  • quotechar gibt das Zeichen an, mit dem Felder umgeben werden, die das Trennzeichen enthalten. Der Standardwert ist ein doppeltes Anführungszeichen (' " ').

  • escapechar gibt das Zeichen an, mit dem das Trennzeichen umgangen wird, falls keine Anführungszeichen verwendet werden. Der Standardwert ist kein Escapezeichen.

Diese Parameter verdienen eine weitere Erklärung. Angenommen, Sie arbeiten mit der folgendenemployee_addresses.txt-Datei:

name,address,date joined
john smith,1132 Anywhere Lane Hoboken NJ, 07030,Jan 4
erica meyers,1234 Smith Lane Hoboken NJ, 07030,March 2

Diese CSV-Datei enthält drei Felder:name,address unddate joined, die durch Kommas getrennt sind. Das Problem ist, dass die Daten für das Feldaddress auch ein Komma zur Angabe der Postleitzahl enthalten.

Es gibt drei verschiedene Möglichkeiten, um mit dieser Situation umzugehen:

  • Use a different delimiter
    Auf diese Weise kann das Komma sicher in den Daten selbst verwendet werden. Sie verwenden den optionalen Parameterdelimiter, um das neue Trennzeichen anzugeben.

  • Wrap the data in quotes
    Die Besonderheit des von Ihnen gewählten Trennzeichens wird in Zeichenfolgen in Anführungszeichen ignoriert. Daher können Sie das zum Anführungszeichen verwendete Zeichen mit dem optionalen Parameterquotecharangeben. Solange dieses Zeichen auch nicht in den Daten enthalten ist, geht es Ihnen gut.

  • Escape the delimiter characters in the data
    Escape-Zeichen funktionieren genauso wie in Formatzeichenfolgen und machen die Interpretation des Escape-Zeichens (in diesem Fall des Trennzeichens) ungültig. Wenn ein Escape-Zeichen verwendet wird, muss es mit dem optionalen Parameterescapecharangegeben werden.

Schreiben von CSV-Dateien mitcsv

Sie können auch mit einemwriter-Objekt und der.write_row()-Methode in eine CSV-Datei schreiben:

import csv

with open('employee_file.csv', mode='w') as employee_file:
    employee_writer = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)

    employee_writer.writerow(['John Smith', 'Accounting', 'November'])
    employee_writer.writerow(['Erica Meyers', 'IT', 'March'])

Der optionale Parameterquotechar gibtwriteran, welches Zeichen zum Schreiben von Feldern beim Schreiben verwendet werden soll. Ob ein Anführungszeichen verwendet wird oder nicht, wird jedoch durch den optionalen Parameterquotingbestimmt:

  • Wennquoting aufcsv.QUOTE_MINIMAL gesetzt ist, zitiert.writerow() Felder nur dann, wenn siedelimiter oderquotechar enthalten. Dies ist der Standardfall.

  • Wennquoting aufcsv.QUOTE_ALL gesetzt ist, zitiert.writerow() alle Felder.

  • Wennquoting aufcsv.QUOTE_NONNUMERIC gesetzt ist, zitiert.writerow() alle Felder, die Textdaten enthalten, und konvertiert alle numerischen Felder in den Datentypfloat.

  • Wennquoting aufcsv.QUOTE_NONE gesetzt ist, werden.writerow() durch Trennzeichen ausgeblendet, anstatt sie in Anführungszeichen zu setzen. In diesem Fall müssen Sie auch einen Wert für den optionalen Parameterescapecharangeben.

Das Zurücklesen der Datei im Klartext zeigt, dass die Datei wie folgt erstellt wird:

John Smith,Accounting,November
Erica Meyers,IT,March

Schreiben einer CSV-Datei aus einem Wörterbuch mitcsv

Da Sie unsere Daten in ein Wörterbuch einlesen können, ist es nur fair, dass Sie sie auch aus einem Wörterbuch herausschreiben können:

import csv

with open('employee_file2.csv', mode='w') as csv_file:
    fieldnames = ['emp_name', 'dept', 'birth_month']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'emp_name': 'John Smith', 'dept': 'Accounting', 'birth_month': 'November'})
    writer.writerow({'emp_name': 'Erica Meyers', 'dept': 'IT', 'birth_month': 'March'})

Im Gegensatz zuDictReader ist beim Schreiben eines Wörterbuchs der Parameterfieldnames erforderlich. Dies ist sinnvoll, wenn Sie darüber nachdenken: Ohne eine Liste vonfieldnames können dieDictWriter nicht wissen, welche Schlüssel zum Abrufen von Werten aus Ihren Wörterbüchern verwendet werden sollen. Außerdem werden die Schlüssel infieldnames verwendet, um die erste Zeile als Spaltennamen zu schreiben.

Der obige Code generiert die folgende Ausgabedatei:

emp_name,dept,birth_month
John Smith,Accounting,November
Erica Meyers,IT,March

Analysieren von CSV-Dateien mit derpandas-Bibliothek

Natürlich ist die Python CSV-Bibliothek nicht das einzige Spiel in der Stadt. Das Lesen von CSV-Dateien ist auch inpandas möglich. Es wird dringend empfohlen, wenn Sie viele Daten analysieren müssen.

pandas ist eine Open-Source-Python-Bibliothek, die leistungsstarke Datenanalysetools und benutzerfreundliche Datenstrukturen bietet. pandas ist für alle Python-Installationen verfügbar, ist jedoch ein wichtiger Bestandteil derAnaconda-Verteilung und funktioniert inJupyter notebooks sehr gut, um Daten, Code, Analyseergebnisse, Visualisierungen und narrativen Text gemeinsam zu nutzen .

Die Installation vonpandas und seiner Abhängigkeiten inAnaconda ist einfach:

$ conda install pandas

Wie wirdpip/pipenv für andere Python-Installationen verwendet:

$ pip install pandas

Wir werden uns nicht mit den Einzelheiten der Funktionsweise vonpandas oder ihrer Verwendung befassen. Eine ausführliche Beschreibung der Verwendung vonpandas zum Lesen und Analysieren großer Datenmengen finden Sie inShantnu Tiwari’s hervorragendem Artikel zuworking with large Excel files in pandas.

Lesen von CSV-Dateien mitpandas

Um einen Teil der Leistungsfähigkeit der CSV-Funktionen vonpandaszu demonstrieren, habe ich eine etwas kompliziertere zu lesende Datei namenshrdata.csv erstellt. Es enthält Daten zu Mitarbeitern des Unternehmens:

Name,Hire Date,Salary,Sick Days remaining
Graham Chapman,03/15/14,50000.00,10
John Cleese,06/01/15,65000.00,8
Eric Idle,05/12/14,45000.00,10
Terry Jones,11/01/13,70000.00,3
Terry Gilliam,08/12/14,48000.00,7
Michael Palin,05/23/13,66000.00,8

Das Einlesen der CSV inpandasDataFrame ist schnell und unkompliziert:

import pandas
df = pandas.read_csv('hrdata.csv')
print(df)

Das war's: drei Codezeilen, von denen nur eine die eigentliche Arbeit erledigt. pandas.read_csv() öffnet, analysiert und liest die bereitgestellte CSV-Datei und speichert die Daten inDataFrame. Das Drucken vonDataFrame führt zu folgender Ausgabe:

             Name Hire Date   Salary  Sick Days remaining
0  Graham Chapman  03/15/14  50000.0                   10
1     John Cleese  06/01/15  65000.0                    8
2       Eric Idle  05/12/14  45000.0                   10
3     Terry Jones  11/01/13  70000.0                    3
4   Terry Gilliam  08/12/14  48000.0                    7
5   Michael Palin  05/23/13  66000.0                    8

Hier sind einige erwähnenswerte Punkte:

  • Zunächst erkanntepandas, dass die erste Zeile der CSV Spaltennamen enthielt, und verwendete diese automatisch. Ich nenne das Güte.

  • pandas verwendet jedoch auch ganzzahlige Indizes auf Nullbasis inDataFrame. Das liegt daran, dass wir nicht gesagt haben, wie unser Index aussehen soll.

  • Wenn Sie sich die Datentypen unserer Spalten ansehen, werden Sie feststellen, dasspandas die SpaltenSalary undSick Days remaining ordnungsgemäß in Zahlen konvertiert hat, die SpalteHire Datejedoch immer noch aString. Dies kann im interaktiven Modus leicht bestätigt werden:

    >>>

>>> print(type(df['Hire Date'][0]))

Lassen Sie uns diese Probleme einzeln angehen. Fügen Sie den optionalen Parameterindex_colhinzu, um eine andere Spalte als Index fürDataFramezu verwenden:

import pandas
df = pandas.read_csv('hrdata.csv', index_col='Name')
print(df)

Jetzt ist das FeldNameunser IndexDataFrame:

               Hire Date   Salary  Sick Days remaining
Name
Graham Chapman  03/15/14  50000.0                   10
John Cleese     06/01/15  65000.0                    8
Eric Idle       05/12/14  45000.0                   10
Terry Jones     11/01/13  70000.0                    3
Terry Gilliam   08/12/14  48000.0                    7
Michael Palin   05/23/13  66000.0                    8

Als nächstes legen wir den Datentyp des FeldsHire Datefest. Mit dem optionalen Parameterparse_dates, der als Liste von Spaltennamen definiert ist, die als Datumsangaben behandelt werden sollen, können Siepandas zwingen, Daten als Datum zu lesen:

import pandas
df = pandas.read_csv('hrdata.csv', index_col='Name', parse_dates=['Hire Date'])
print(df)

Beachten Sie den Unterschied in der Ausgabe:

                Hire Date   Salary  Sick Days remaining
Name
Graham Chapman 2014-03-15  50000.0                   10
John Cleese    2015-06-01  65000.0                    8
Eric Idle      2014-05-12  45000.0                   10
Terry Jones    2013-11-01  70000.0                    3
Terry Gilliam  2014-08-12  48000.0                    7
Michael Palin  2013-05-23  66000.0                    8

Das Datum ist jetzt richtig formatiert, was im interaktiven Modus leicht bestätigt werden kann:

>>>

>>> print(type(df['Hire Date'][0]))

Wenn Ihre CSV-Dateien in der ersten Zeile keine Spaltennamen enthalten, können Sie den optionalen Parameternamesverwenden, um eine Liste der Spaltennamen bereitzustellen. Sie können dies auch verwenden, wenn Sie die in der ersten Zeile angegebenen Spaltennamen überschreiben möchten. In diesem Fall müssen Siepandas.read_csv() auch anweisen, vorhandene Spaltennamen mithilfe des optionalen Parametersheader=0 zu ignorieren:

import pandas
df = pandas.read_csv('hrdata.csv',
            index_col='Employee',
            parse_dates=['Hired'],
            header=0,
            names=['Employee', 'Hired','Salary', 'Sick Days'])
print(df)

Beachten Sie, dass, da sich die Spaltennamen geändert haben, auch die in den optionalen Parameternindex_col undparse_datesangegebenen Spalten geändert werden müssen. Dies führt nun zu folgender Ausgabe:

                    Hired   Salary  Sick Days
Employee
Graham Chapman 2014-03-15  50000.0         10
John Cleese    2015-06-01  65000.0          8
Eric Idle      2014-05-12  45000.0         10
Terry Jones    2013-11-01  70000.0          3
Terry Gilliam  2014-08-12  48000.0          7
Michael Palin  2013-05-23  66000.0          8

Schreiben von CSV-Dateien mitpandas

Wenn Sie Ihre Daten nicht wieder auspandas herausholen können, hilft es Ihnen natürlich nicht viel. Das Schreiben vonDataFrame in eine CSV-Datei ist genauso einfach wie das Einlesen einer. Schreiben wir die Daten mit den neuen Spaltennamen in eine neue CSV-Datei:

import pandas
df = pandas.read_csv('hrdata.csv',
            index_col='Employee',
            parse_dates=['Hired'],
            header=0,
            names=['Employee', 'Hired', 'Salary', 'Sick Days'])
df.to_csv('hrdata_modified.csv')

Der einzige Unterschied zwischen diesem Code und dem obigen Lesecode besteht darin, dass der Aufruf vonprint(df)durchdf.to_csv() ersetzt wurde, wobei der Dateiname angegeben wurde. Die neue CSV-Datei sieht folgendermaßen aus:

Employee,Hired,Salary,Sick Days
Graham Chapman,2014-03-15,50000.0,10
John Cleese,2015-06-01,65000.0,8
Eric Idle,2014-05-12,45000.0,10
Terry Jones,2013-11-01,70000.0,3
Terry Gilliam,2014-08-12,48000.0,7
Michael Palin,2013-05-23,66000.0,8

Fazit

Wenn Sie die Grundlagen des Lesens von CSV-Dateien verstehen, werden Sie beim Importieren von Daten nie mit platten Füßen erwischt. Die meisten CSV-Lese-, Verarbeitungs- und Schreibaufgaben können problemlos von der Python-Basisbibliothekcsvausgeführt werden. Wenn Sie viele Daten lesen und verarbeiten müssen, bietet diepandas-Bibliothek auch schnelle und einfache CSV-Bearbeitungsfunktionen.

__ Take the Quiz: Testen Sie Ihr Wissen mit unserem interaktiven Quiz „Lesen und Schreiben von CSV-Dateien in Python“. Nach Abschluss erhalten Sie eine Punktzahl, mit der Sie Ihren Lernfortschritt im Laufe der Zeit verfolgen können:

Gibt es andere Möglichkeiten, Textdateien zu analysieren? Natürlich! Bibliotheken wieANTLR,PLY undPlyPlus können alle Hochleistungs-Parsing verarbeiten. Wenn die einfache Manipulation vonStringnicht funktioniert, gibt es immer reguläre Ausdrücke.

Aber das sind Themen für andere Artikel…