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 Bibliothekcsv
und die CSV-Analyse mithilfe der Bibliothekpandas
kennenlernen.
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 Parameterfieldnames
auf 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 Parameterquotechar
angeben. 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 Parameterescapechar
angegeben 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
gibtwriter
an, welches Zeichen zum Schreiben von Feldern beim Schreiben verwendet werden soll. Ob ein Anführungszeichen verwendet wird oder nicht, wird jedoch durch den optionalen Parameterquoting
bestimmt:
-
Wenn
quoting
aufcsv.QUOTE_MINIMAL
gesetzt ist, zitiert.writerow()
Felder nur dann, wenn siedelimiter
oderquotechar
enthalten. Dies ist der Standardfall. -
Wenn
quoting
aufcsv.QUOTE_ALL
gesetzt ist, zitiert.writerow()
alle Felder. -
Wenn
quoting
aufcsv.QUOTE_NONNUMERIC
gesetzt ist, zitiert.writerow()
alle Felder, die Textdaten enthalten, und konvertiert alle numerischen Felder in den Datentypfloat
. -
Wenn
quoting
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 Parameterescapechar
angeben.
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 vonpandas
zu 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 inpandas
DataFrame
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 erkannte
pandas
, 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, dass
pandas
die SpaltenSalary
undSick Days remaining
ordnungsgemäß in Zahlen konvertiert hat, die SpalteHire Date
jedoch 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_col
hinzu, um eine andere Spalte als Index fürDataFrame
zu verwenden:
import pandas
df = pandas.read_csv('hrdata.csv', index_col='Name')
print(df)
Jetzt ist das FeldName
unser 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 Date
fest. 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 Parameternames
verwenden, 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_dates
angegebenen 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-Basisbibliothekcsv
ausgefü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 vonString
nicht funktioniert, gibt es immer reguläre Ausdrücke.
Aber das sind Themen für andere Artikel…