Python Language
Dateien und Ordner E / A
Suche…
Einführung
Wenn Sie Daten speichern, lesen oder kommunizieren möchten, ist das Arbeiten mit den Dateien eines Betriebssystems mit Python sowohl notwendig als auch einfach. Im Gegensatz zu anderen Sprachen, in denen für die Dateieingabe und -ausgabe komplexes Lesen und Schreiben von Objekten erforderlich ist, vereinfacht Python den Vorgang, indem nur Befehle zum Öffnen, Lesen und Schreiben der Datei benötigt werden. In diesem Thema wird erläutert, wie Python mit Dateien auf dem Betriebssystem kommunizieren kann.
Syntax
- file_object = open (Dateiname [, Zugriffsmodus] [, Pufferung])
Parameter
Parameter | Einzelheiten |
---|---|
Dateiname | den Pfad zu Ihrer Datei oder, wenn sich die Datei im Arbeitsverzeichnis befindet, den Dateinamen Ihrer Datei |
Zugriffsmodus | ein Zeichenfolgewert, der bestimmt, wie die Datei geöffnet wird |
Pufferung | Ein ganzzahliger Wert, der für die optionale Zeilenpufferung verwendet wird |
Bemerkungen
Vermeiden Sie das plattformübergreifende Encoding Hell
Bei der Verwendung von Pythons integriertem open()
ist es am besten, das encoding
immer zu übergeben, wenn der Code plattformübergreifend ausgeführt werden soll. Der Grund dafür ist, dass die Standardkodierung eines Systems von Plattform zu Plattform unterschiedlich ist.
Während linux
Systeme tatsächlich utf-8
als Standard verwenden, gilt dies nicht unbedingt für Mac und Windows.
So überprüfen Sie die Standardkodierung eines Systems:
import sys
sys.getdefaultencoding()
von jedem Python-Interpreter.
Daher ist es ratsam, immer eine Codierung zu spezifizieren, um sicherzustellen, dass die Strings, mit denen Sie arbeiten, so codiert werden, wie Sie sie für wahrscheinlich halten.
with open('somefile.txt', 'r', encoding='UTF-8') as f:
for line in f:
print(line)
Dateimodi
Es gibt verschiedene Modi, mit denen Sie eine Datei öffnen können, die durch den mode
angegeben wird. Diese schließen ein:
'r'
- Lesemodus. Der Standard. Sie können die Datei nur lesen, nicht ändern. In diesem Modus muss die Datei vorhanden sein.'w'
- Schreibmodus. Falls nicht vorhanden, wird eine neue Datei erstellt. Andernfalls wird die Datei gelöscht und Sie können schreiben.'a'
- Anfügemodus. Es werden Daten an das Ende der Datei geschrieben. Die Datei wird nicht gelöscht, und die Datei muss für diesen Modus vorhanden sein.'rb'
- Lesemodus im Binärmodus. Dies ist ähnlich wie beir
nur dass das Lesen im binären Modus erzwungen wird. Dies ist auch eine Standardeinstellung.'r+'
- Lesemodus und gleichzeitig Schreibmodus. Auf diese Weise können Sie Dateien gleichzeitig lesen und beschreiben, ohner
undw
.'rb+'
- Lese- und Schreibmodus im Binärmodus. Dasselbe wier+
außer dass die Daten binär sind'wb'
- Schreibmodus in binär. Dasselbe wiew
außer dass die Daten binär sind.'w+'
- Schreib- und Lesemodus. Genau wier+
aber wenn die Datei nicht existiert, wird eine neue erstellt. Andernfalls wird die Datei überschrieben.'wb+'
- Schreib- und Lesemodus im Binärmodus. Dasselbe wiew+
aber die Daten sind binär.'ab'
- im binären Modus anhängen. Ähnlich wiea
dass die Daten binär sind.'a+'
- Anhänge- und Lesemodus. Ähnlich wiew+
da eine neue Datei erstellt wird, wenn die Datei nicht vorhanden ist. Andernfalls befindet sich der Dateizeiger am Ende der Datei, sofern vorhanden.'ab+'
- Anfügen und Lesen im Binärmodus. Dasselbe wiea+
außer dass die Daten binär sind.with open(filename, 'r') as f: f.read() with open(filename, 'w') as f: f.write(filedata) with open(filename, 'a') as f: f.write('\n' + newdata)
r | r + | w | w + | ein | a + | |
---|---|---|---|---|---|---|
Lesen | ✔ | ✔ | ✘ | ✔ | ✘ | ✔ |
Schreiben | ✘ | ✔ | ✔ | ✔ | ✔ | ✔ |
Erzeugt eine Datei | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ |
Löscht die Datei | ✘ | ✘ | ✔ | ✔ | ✘ | ✘ |
Ausgangsposition | Start | Start | Start | Start | Ende | Ende |
Python 3 fügte einen neuen Modus für die exclusive creation
damit Sie nicht versehentlich vorhandene Dateien abschneiden oder überschreiben.
-
'x'
- offen für exklusive Erstellung, wirdFileExistsError
wenn die Datei bereits vorhanden ist -
'xb'
- offen für den Schreibmodus für exklusive Schreibvorgänge in binär. Dasselbe wiex
außer dass die Daten binär sind. -
'x+'
- Lese- und Schreibmodus. Ähnlich wiew+
da eine neue Datei erstellt wird, wenn die Datei nicht vorhanden ist. Andernfalls wirdFileExistsError
. -
'xb+'
- Schreib- und Lesemodus. Genau wiex+
aber die Daten sind binär
x | x + | |
---|---|---|
Lesen | ✘ | ✔ |
Schreiben | ✔ | ✔ |
Erzeugt eine Datei | ✔ | ✔ |
Löscht die Datei | ✘ | ✘ |
Ausgangsposition | Start | Start |
Erlauben Sie einem, Ihren offenen Code für Ihre Datei pythonischer zu schreiben:
try:
with open("fname", "r") as fout:
# Work with your open file
except FileExistsError:
# Your error handling goes here
In Python 2 hätten Sie so etwas gemacht
import os.path
if os.path.isfile(fname):
with open("fname", "w") as fout:
# Work with your open file
else:
# Your error handling goes here
Zeile für Zeile eine Datei lesen
Die einfachste Möglichkeit, eine Datei zeilenweise zu durchlaufen:
with open('myfile.txt', 'r') as fp:
for line in fp:
print(line)
readline()
ermöglicht eine detailliertere Kontrolle der zeilenweisen Iteration. Das Beispiel unten entspricht dem obigen Beispiel:
with open('myfile.txt', 'r') as fp:
while True:
cur_line = fp.readline()
# If the result is an empty string
if cur_line == '':
# We have reached the end of the file
break
print(cur_line)
Die gemeinsame Verwendung von for-Loop-Iterator und readline () gilt als schlechte Praxis.
Normalerweise wird die readlines()
-Methode zum Speichern einer iterierbaren Auflistung der Dateizeilen verwendet:
with open("myfile.txt", "r") as fp:
lines = fp.readlines()
for i in range(len(lines)):
print("Line " + str(i) + ": " + line)
Dies würde Folgendes drucken:
Zeile 0: Hallo
Zeile 1: Welt
Den vollständigen Inhalt einer Datei abrufen
Die bevorzugte Methode für Datei-E / A ist die Verwendung des Schlüsselworts with
. Dadurch wird sichergestellt, dass das Dateihandle geschlossen wird, sobald das Lesen oder Schreiben abgeschlossen ist.
with open('myfile.txt') as in_file:
content = in_file.read()
print(content)
oder zu handhaben, die Datei manuell zu schließen, können Sie verzichten with
und rufen Sie einfach close
Sie sich:
in_file = open('myfile.txt', 'r')
content = in_file.read()
print(content)
in_file.close()
Denken Sie daran, dass Sie ohne die Verwendung einer with
Anweisung die Datei aus Versehen offen halten können, falls eine unerwartete Ausnahme auftritt:
in_file = open('myfile.txt', 'r')
raise Exception("oops")
in_file.close() # This will never be called
In eine Datei schreiben
with open('myfile.txt', 'w') as f:
f.write("Line 1")
f.write("Line 2")
f.write("Line 3")
f.write("Line 4")
Wenn Sie myfile.txt
öffnen, werden Sie myfile.txt
sehen:
Zeile 1Line 2Line 3Line 4
Python fügt nicht automatisch Zeilenumbrüche ein. Sie müssen dies manuell tun:
with open('myfile.txt', 'w') as f:
f.write("Line 1\n")
f.write("Line 2\n")
f.write("Line 3\n")
f.write("Line 4\n")
Linie 1
Zeile 2
Zeile 3
Zeile 4
Verwenden Sie os.linesep
als os.linesep
, wenn Sie im Textmodus geöffnete Dateien schreiben (Standardeinstellung). Verwenden Sie stattdessen \n
.
Wenn Sie eine Codierung angeben möchten, fügen Sie einfach die encoding
Parameter an die open
Funktion:
with open('my_file.txt', 'w', encoding='utf-8') as f:
f.write('utf-8 text')
Es ist auch möglich, die print-Anweisung zum Schreiben in eine Datei zu verwenden. Die Mechanismen unterscheiden sich in Python 2 von Python 3, das Konzept ist jedoch das gleiche, dass Sie die Ausgabe, die auf den Bildschirm gegangen wäre, nehmen und sie stattdessen in eine Datei senden kann.
with open('fred.txt', 'w') as outfile:
s = "I'm Not Dead Yet!"
print(s) # writes to stdout
print(s, file = outfile) # writes to outfile
#Note: it is possible to specify the file parameter AND write to the screen
#by making sure file ends up with a None value either directly or via a variable
myfile = None
print(s, file = myfile) # writes to stdout
print(s, file = None) # writes to stdout
In Python 2 hätten Sie so etwas gemacht
outfile = open('fred.txt', 'w')
s = "I'm Not Dead Yet!"
print s # writes to stdout
print >> outfile, s # writes to outfile
Im Gegensatz zur Verwendung der Schreibfunktion fügt die Druckfunktion automatisch Zeilenumbrüche ein.
Inhalte einer Datei in eine andere Datei kopieren
with open(input_file, 'r') as in_file, open(output_file, 'w') as out_file:
for line in in_file:
out_file.write(line)
- Verwenden des
shutil
Moduls:
import shutil
shutil.copyfile(src, dst)
Prüfen Sie, ob eine Datei oder ein Pfad vorhanden ist
Verwenden Sie den EAFP- Codierstil und try
zu öffnen.
import errno
try:
with open(path) as f:
# File exists
except IOError as e:
# Raise the exception if it is not ENOENT (No such file or directory)
if e.errno != errno.ENOENT:
raise
# No such file or directory
Dadurch werden auch Race-Bedingungen vermieden, wenn ein anderer Prozess die Datei zwischen der Prüfung und der Verwendung gelöscht hat. Diese Wettlaufsituation kann in folgenden Fällen auftreten:
Verwenden des
os
Moduls:import os os.path.isfile('/path/to/some/file.txt')
pathlib
:import pathlib path = pathlib.Path('/path/to/some/file.txt') if path.is_file(): ...
Um zu überprüfen, ob ein bestimmter Pfad existiert oder nicht, können Sie das oben beschriebene EAFP-Verfahren befolgen oder den Pfad explizit überprüfen:
import os
path = "/home/myFiles/directory1"
if os.path.exists(path):
## Do stuff
Kopieren Sie eine Verzeichnisstruktur
import shutil
source='//192.168.1.2/Daily Reports'
destination='D:\\Reports\\Today'
shutil.copytree(source, destination)
Das Zielverzeichnis darf noch nicht existieren .
Dateien iterieren (rekursiv)
Um alle Dateien, auch in Unterverzeichnissen, zu iterieren, verwenden Sie os.walk:
import os
for root, folders, files in os.walk(root_dir):
for filename in files:
print root, filename
root_dir kann "." um vom aktuellen Verzeichnis oder einem anderen Pfad aus zu starten.
Wenn Sie auch Informationen über die Datei erhalten möchten, können Sie die effizientere Methode os.scandir wie folgt verwenden :
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_file():
print(entry.name)
Lesen Sie eine Datei zwischen einem Zeilenbereich
Nehmen wir an, Sie möchten nur zwischen bestimmten Zeilen einer Datei iterieren
itertools
können Sie itertools
import itertools with open('myfile.txt', 'r') as f: for line in itertools.islice(f, 12, 30): # do something here
Dies wird durch die Zeilen 13 bis 20 gelesen, da bei der Python-Indexierung von 0 aus begonnen wird. Daher wird Zeile 1 als 0 indiziert
Da können auch einige zusätzliche Zeilen gelesen werden, indem hier das next()
Schlüsselwort verwendet wird.
Wenn Sie das Dateiobjekt als iterierbares Objekt verwenden, verwenden Sie die readline()
Anweisung hier nicht, da die beiden Verfahren zum Durchlaufen einer Datei nicht miteinander gemischt werden sollen
Zufälliger Dateizugriff mit mmap
Durch Verwendung des mmap
Moduls kann der Benutzer willkürlich auf Positionen in einer Datei zugreifen, indem er die Datei in den Arbeitsspeicher einfügt. Dies ist eine Alternative zur Verwendung normaler Dateivorgänge.
import mmap
with open('filename.ext', 'r') as fd:
# 0: map the whole file
mm = mmap.mmap(fd.fileno(), 0)
# print characters at indices 5 through 10
print mm[5:10]
# print the line starting from mm's current position
print mm.readline()
# write a character to the 5th index
mm[5] = 'a'
# return mm's position to the beginning of the file
mm.seek(0)
# close the mmap object
mm.close()
Ersetzen von Text in einer Datei
import fileinput
replacements = {'Search1': 'Replace1',
'Search2': 'Replace2'}
for line in fileinput.input('filename.txt', inplace=True):
for search_for in replacements:
replace_with = replacements[search_for]
line = line.replace(search_for, replace_with)
print(line, end='')
Prüfen, ob eine Datei leer ist
>>> import os
>>> os.stat(path_to_file).st_size == 0
oder
>>> import os
>>> os.path.getsize(path_to_file) > 0
Beide geben jedoch eine Ausnahme aus, wenn die Datei nicht vorhanden ist. Um zu vermeiden, einen solchen Fehler abfangen zu müssen, führen Sie folgende Schritte aus:
import os
def is_empty_file(fpath):
return os.path.isfile(fpath) and os.path.getsize(fpath) > 0
was einen bool
Wert bool
.