3776 Stimmen

Wie kopiert man Dateien?

Wie kann ich eine Datei in Python kopieren?

13voto

rassa45 Punkte 3400

Bei großen Dateien habe ich die Datei Zeile für Zeile gelesen und jede Zeile in ein Array geschrieben. Sobald das Array eine bestimmte Größe erreicht hatte, wurde es an eine neue Datei angehängt.

for line in open("file.txt", "r"):
    list.append(line)
    if len(list) == 1000000: 
        output.writelines(list)
        del list[:]

2 Stimmen

Dies scheint ein wenig überflüssig zu sein, da der Writer die Pufferung übernehmen sollte. for l in open('file.txt','r'): output.write(l) sollte funktionieren; richten Sie einfach den Puffer des Ausgabestroms nach Ihren Bedürfnissen ein. oder Sie können nach den Bytes gehen, indem Sie eine Schleife über einen Versuch mit output.write(read(n)); output.flush() wobei n ist die Anzahl der Bytes, die man auf einmal schreiben möchte. Beide haben auch keine Bedingung, die man überprüfen muss, was ein Bonus ist.

1 Stimmen

Ja, aber ich dachte, dass dies vielleicht leichter zu verstehen ist, weil ganze Zeilen und nicht nur Teile davon kopiert werden (falls wir nicht wissen, wie viele Bytes jede Zeile hat).

0 Stimmen

Sehr richtig. Kodierung für den Unterricht und Kodierung für die Effizienz sind sehr unterschiedlich.

9voto

Leonardo Wildt Punkte 2251

Falls Sie bis hierher gekommen sind. Die Antwort ist, dass Sie den gesamten Pfad und Dateinamen benötigen

import os

shutil.copy(os.path.join(old_dir, file), os.path.join(new_dir, file))

0 Stimmen

Wenn der Dateiname erhalten bleibt, können Sie die Datei in den Zielordner kopieren: shutil.copy(os.path.join(old_dir, file), new_dir)

8voto

Basj Punkte 36025

Hier ist eine einfache Möglichkeit, dies zu tun, ohne ein Modul. Es ist ähnlich wie diese Antwort aber es hat den Vorteil, dass es auch funktioniert, wenn es sich um eine große Datei handelt, die nicht in den RAM passt:

with open('sourcefile', 'rb') as f, open('destfile', 'wb') as g:
    while True:
        block = f.read(16*1024*1024)  # work by blocks of 16 MB
        if not block:  # end of file
            break
        g.write(block)

Da wir eine neue Datei schreiben, bleibt die Änderungszeit usw. nicht erhalten.
Wir können dann verwenden os.utime falls erforderlich.

4voto

R J Punkte 4305

Ähnlich wie bei der akzeptierten Antwort könnte der folgende Codeblock nützlich sein, wenn Sie auch sicherstellen wollen, dass alle (nicht vorhandenen) Ordner im Pfad zum Ziel erstellt werden.

from os import path, makedirs
from shutil import copyfile
makedirs(path.dirname(path.abspath(destination_path)), exist_ok=True)
copyfile(source_path, destination_path)

Wie aus den akzeptierten Antworten hervorgeht, überschreiben diese Zeilen jede Datei, die im Zielpfad existiert, so dass es manchmal nützlich sein kann, auch etwas hinzuzufügen: if not path.exists(destination_path): vor diesem Codeblock.

-3voto

Savai Maheshwari Punkte 177

Python bietet integrierte Funktionen zum einfachen Kopieren von Dateien mit Hilfe der Shell-Dienstprogramme des Betriebssystems.

Der folgende Befehl wird zum Kopieren von Dateien verwendet

shutil.copy(src,dst)

Der folgende Befehl wird zum Kopieren von Dateien mit MetaDaten-Informationen verwendet

shutil.copystat(src,dst)

0 Stimmen

Sie sollten Folgendes ausführen copy dann copystat um die Datei-Metadaten zu erhalten. In Python 3.3+ copystat kopiert auch erweiterte Attribute.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X