Grundlagen des Dateizugangs

PythonPythonBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Die meisten Programme müssen Eingaben von irgendwo lesen. In diesem Abschnitt wird der Zugang zu Dateien behandelt.

Dateieneingabe und -ausgabe

Eine Datei öffnen.

f = open('foo.txt', 'rt')     ## Zum Lesen (Text) öffnen
g = open('bar.txt', 'wt')     ## Zum Schreiben (Text) öffnen

Alle Daten lesen.

data = f.read()

## Nur bis zu'maxbytes' Bytes lesen
data = f.read([maxbytes])

Text schreiben.

g.write('einige Text')

Beenden, wenn fertig.

f.close()
g.close()

Dateien sollten richtig geschlossen werden, und es ist ein einfacher Schritt, den man vergisst. Daher ist der bevorzugte Ansatz, die with-Anweisung wie folgt zu verwenden.

with open(filename, 'rt') as file:
    ## Die Datei `file` verwenden
  ...
    ## Keine explizite Schließung erforderlich
...Anweisungen

Dies schließt die Datei automatisch, wenn der Steuerfluss den eingerückten Codeblock verlässt.

Übliche Muster zum Lesen von Dateidaten

Eine ganze Datei als String auf einmal lesen.

with open('foo.txt', 'rt') as file:
    data = file.read()
    ## `data` ist ein String mit allem Text in `foo.txt`

Eine Datei Zeile für Zeile durch Iteration lesen.

with open(filename, 'rt') as file:
    for line in file:
        ## Verarbeiten Sie die Zeile

Übliche Muster zum Schreiben in eine Datei

String-Daten schreiben.

with open('outfile', 'wt') as out:
    out.write('Hello World\n')
 ...

Die print-Funktion umleiten.

with open('outfile', 'wt') as out:
    print('Hello World', file=out)
 ...

Diese Übungen basieren auf einer Datei portfolio.csv. Die Datei enthält eine Liste von Zeilen mit Informationen über ein Aktienportfolio. Es wird angenommen, dass Sie im Verzeichnis ~/project/ arbeiten. Wenn Sie sich nicht sicher sind, können Sie herausfinden, wo Python denkt, dass es läuft, indem Sie Folgendes tun:

>>> import os
>>> os.getcwd()
'/home/labex/project' ## Ausgabe variiert
>>>

Übung 1.26: Dateivorbereitungen

Zunächst versuchen Sie, die gesamte Datei als einen großen String auf einmal zu lesen:

>>> with open('portfolio.csv', 'rt') as f:
        data = f.read()

>>> data
'name,shares,price\n"AA",100,32.20\n"IBM",50,91.10\n"CAT",150,83.44\n"MSFT",200,51.23\n"GE",95,40.37\n"MSFT",50,65.10\n"IBM",100,70.44\n'
>>> print(data)
name,shares,price
"AA",100,32.20
"IBM",50,91.10
"CAT",150,83.44
"MSFT",200,51.23
"GE",95,40.37
"MSFT",50,65.10
"IBM",100,70.44
>>>

Im obigen Beispiel sollte bemerkt werden, dass Python zwei Ausgabemodi hat. Im ersten Modus, in dem Sie data an der Eingabeaufforderung eingeben, zeigt Ihnen Python die ursprüngliche Stringrepräsentation einschließlich von Anführungszeichen und Escapecodes. Wenn Sie print(data) eingeben, erhalten Sie die tatsächliche formatierte Ausgabe des Strings.

Obwohl das Lesen einer Datei auf einmal einfach ist, ist es oft nicht die am besten geeignete Methode, insbesondere wenn die Datei sehr groß ist oder Zeilen von Text enthält, die Sie zeilenweise verarbeiten möchten.

Um eine Datei zeilenweise zu lesen, verwenden Sie eine for-Schleife wie diese:

>>> with open('portfolio.csv', 'rt') as f:
        for line in f:
            print(line, end='')

name,shares,price
"AA",100,32.20
"IBM",50,91.10
...
>>>

Wenn Sie diesen Code wie gezeigt verwenden, werden Zeilen gelesen, bis das Ende der Datei erreicht ist, an dem Punkt stoppt die Schleife.

In bestimmten Fällen möchten Sie möglicherweise manuell eine einzige Zeile von Text lesen oder überspringen (z.B. möchten Sie vielleicht die erste Zeile der Spaltenüberschriften überspringen).

>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f)
>>> headers
'name,shares,price\n'
>>> for line in f:
    print(line, end='')

"AA",100,32.20
"IBM",50,91.10
...
>>> f.close()
>>>

next() gibt die nächste Zeile von Text in der Datei zurück. Wenn Sie es wiederholt aufrufen würden, würden Sie aufeinanderfolgende Zeilen erhalten. Allerdings sollten Sie wissen, dass die for-Schleife bereits next() verwendet, um ihre Daten zu erhalten. Daher würden Sie es normalerweise nicht direkt aufrufen, es sei denn, Sie versuchen, wie gezeigt, explizit eine einzelne Zeile zu überspringen oder zu lesen.

Sobald Sie Zeilen einer Datei lesen, können Sie beginnen, weitere Verarbeitungen wie das Aufteilen durchzuführen. Beispielsweise versuchen Sie dies:

>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f).split(',')
>>> headers
['name','shares', 'price\n']
>>> for line in f:
    row = line.split(',')
    print(row)

['"AA"', '100', '32.20\n']
['"IBM"', '50', '91.10\n']
...
>>> f.close()

Hinweis: In diesen Beispielen wird f.close() explizit aufgerufen, weil die with-Anweisung nicht verwendet wird.

Übung 1.27: Lesen einer Daten-Datei

Jetzt, da Sie wissen, wie man eine Datei liest, schreiben wir ein Programm, um eine einfache Berechnung durchzuführen.

Die Spalten in portfolio.csv entsprechen dem Namen der Aktie, der Anzahl der Anteile und dem Kaufpreis eines einzelnen Aktienportfolios. Schreiben Sie ein Programm namens pcost.py im Verzeichnis /home/labex/project, das diese Datei öffnet, alle Zeilen liest und berechnet, wie viel es gekostet hat, alle Anteile im Portfolio zu erwerben.

Hinweis: Um einen String in einen Integer umzuwandeln, verwenden Sie int(s). Um einen String in einen Gleitkomma-Wert umzuwandeln, verwenden Sie float(s).

Ihr Programm sollte eine Ausgabe wie die folgende ausgeben:

Gesamtkosten 44671.15
✨ Lösung prüfen und üben

Übung 1.28: Andere Arten von "Dateien"

Was passiert, wenn Sie eine nicht-textuelle Datei wie eine gzip-komprimierte Daten-Datei lesen möchten? Die eingebaut-funktion open() hilft Ihnen hier nicht weiter, aber Python hat ein Bibliotheksmodul gzip, das gzip-komprimierte Dateien lesen kann.

Versuchen Sie es:

>>> import gzip
>>> with gzip.open('portfolio.csv.gz', 'rt') as f:
    for line in f:
        print(line, end='')

... schauen Sie sich die Ausgabe an...
>>>

Hinweis: Das Einbeziehen des Dateimodus 'rt' ist hier von entscheidender Bedeutung. Wenn Sie das vergessen, erhalten Sie Bytezeichenketten anstelle von normalen Textzeichenketten.

Kommentar: Sollten wir hier nicht Pandas verwenden?

Datenwissenschaftler weisen schnell darauf hin, dass Bibliotheken wie Pandas bereits eine Funktion zum Lesen von CSV-Dateien haben. Das stimmt - und es funktioniert ziemlich gut. Dies ist jedoch kein Kurs zum Lernen von Pandas. Das Lesen von Dateien ist ein allgemeineres Problem als die Spezifikationen von CSV-Dateien. Der Hauptgrund, warum wir mit einer CSV-Datei arbeiten, ist, dass es ein für die meisten Programmierer vertrautes Format ist und es relativ einfach ist, direkt damit umzugehen - wobei dabei viele Python-Features gezeigt werden. Also, verwenden Sie auf alle Fälle Pandas, wenn Sie wieder arbeiten. Für den Rest dieses Kurses werden wir jedoch bei der standardmäßigen Python-Funktionalität bleiben.

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Lab zu Dateiverwaltung abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.