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 bei r 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, ohne r und w .

  • 'rb+' - Lese- und Schreibmodus im Binärmodus. Dasselbe wie r+ außer dass die Daten binär sind

  • 'wb' - Schreibmodus in binär. Dasselbe wie w außer dass die Daten binär sind.

  • 'w+' - Schreib- und Lesemodus. Genau wie r+ aber wenn die Datei nicht existiert, wird eine neue erstellt. Andernfalls wird die Datei überschrieben.

  • 'wb+' - Schreib- und Lesemodus im Binärmodus. Dasselbe wie w+ aber die Daten sind binär.

  • 'ab' - im binären Modus anhängen. Ähnlich wie a dass die Daten binär sind.

  • 'a+' - Anhänge- und Lesemodus. Ähnlich wie w+ 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 wie a+ 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, wird FileExistsError wenn die Datei bereits vorhanden ist
  • 'xb' - offen für den Schreibmodus für exklusive Schreibvorgänge in binär. Dasselbe wie x außer dass die Daten binär sind.
  • 'x+' - Lese- und Schreibmodus. Ähnlich wie w+ da eine neue Datei erstellt wird, wenn die Datei nicht vorhanden ist. Andernfalls wird FileExistsError .
  • 'xb+' - Schreib- und Lesemodus. Genau wie x+ 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:

Python 3.x 3.3
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

Python 2.x 2.0
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.

Python 3.x 3.0
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

Python 2.x 2.0
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')
    
Python 3.x 3.4
  • 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.

Python 3.x 3.5

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 .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow