Kopírování Souboru v Pythonu

Úvod

Pokud jde o používání Pythonu pro kopírování souborů, existují dva hlavní způsoby: pomocí shutil modul nebo os modul. Všechny os metody, zde jsou metody, které nám umožňují spouštět příkazy shellu z našeho Python kód, který budeme používat k provedení copy příkaz (Windows) nebo cp příkaz (Unix).

všimněte Si, že mnoho z těchto metod, v obou shutil modul os modulu, mají velmi podobné funkce (což by nemělo být překvapivé), ale každá se liší ve funkčnosti od sebe velmi mírně, což vysvětlím stejně.

kopírování souborů pomocí modulu shutil

modul shutil nabízí několik metod na vysoké úrovni pro kopírování souborů. Zde jsou hlavní:

copyfile

tato metoda zkopíruje obsah jednoho souboru do jiného souboru. Cíl, který je mu poskytnut, musí být zapisovatelný soubor a musí mít jiný název než zdrojový soubor. Pokud jsou názvy stejné, vygeneruje chybu. Pokud cílový soubor již existuje, bude nahrazen nově zkopírovaným souborem.

syntaxe pro tuto metodu je:

shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)

například následující kód zkopíruje soubor s názvem “ file1.txt “ do souboru s názvem „soubor2.txt“:

import shutilshutil.copyfile('file1.txt', 'file2.txt')

Jeden zajímavý a potenciálně užitečný prvek shutil.copyfilefollow_symlinks Boolean argument. Pokud je nastaven na False a zdrojový soubor je symbolický odkaz, místo kopírování souboru bude vytvořen nový symbolický odkaz.

kopírovat

Tato metoda je velmi podobná copyfile, s hlavním rozdílem je, že kromě kopírování obsahu ze zdrojového souboru, jde ještě o krok dále a také kopie souboru, oprávnění v systému souborů. Kopírování oprávnění souborů není ve většině programovacích jazyků triviální úkol, takže je to pěkná funkce.

syntaxe je následující:

shutil.copy(src_file, dest_file, *, follow_symlinks=True)

každý z těchto parametrů je stejný jako u metody copyfile. Například následující kód zkopíruje “ soubor1.txt „do“ souboru3.txt“.

import shutilshutil.copy('file1.txt', 'file3.txt')

Poznámka: ujistěte Se, že nemáte jméno skriptu stejné jako jeden z modulu import (což jsem omylem udělal při testování kód k tomuto článku). Pokud tak učiníte, při pokusu o import tohoto modulu se zobrazí chyba kvůli problému s kruhovým importem.

copy2

stejně Jako u předchozí metody, copy2 metoda je stejná jako copy metoda, ale kromě kopírování obsahu souboru je také pokusí zachovat všechny zdroje metadat souboru. V případě, že platforma neumožňuje pro kompletní ukládání metadat, a pak copy2 nevrátí selhání, a to bude jen zachovat všechna metadata, to může.

syntaxe je následující:

shutil.copy2(src_file, dest_file, *, follow_symlinks=True)

tyto parametry jsou opět stejné jako v předchozích příkazech, které jsme dosud zmínili.

například následující kód zkopíruje “ soubor1.txt „do“ souboru4.txt“, stejně jako zachovat metadata původního souboru, “ file1.txt“.

import shutilshutil.copy2('file1.txt', 'file4.txt')
$ python copy-files.py $ ls -ltotal 32-rw-r--r-- 1 scott staff 91 Oct 27 11:26 copy-files.py-rw-r--r-- 1 scott staff 6 Oct 27 11:27 file1.txt-rw-r--r-- 1 scott staff 6 Oct 27 11:29 file3.txt-rw-r--r-- 1 scott staff 6 Oct 27 11:27 file4.txt

Jak můžeme vidět z provádění našeho kódu výše, “ file1.txt „byl zkopírován do“ file4.txt“. Možná jste si však všimli, že datum vytvoření bylo v novém souboru zachováno, na rozdíl od shutil.copy, který zkopíroval “ file1.txt “ do “ soubor3.txt “ a dal mu nové datum vytvoření.

copyfileobj

tato metoda zkopíruje obsah zdrojového souboru do cílového souboru z aktuální pozice zdrojového souboru. To znamená, že pokud čtete data z objektu zdrojového souboru, pak pozice, na které přestanete číst, je pozice copyfileobj začne kopírovat z.

syntaxe je následující:

shutil.copyfileobj(src_file_object, dest_file_object)

význam parametrů zdrojového a cílového souboru je podobný předchozím příkazům,ale nyní se vztahují k objektům. Parametr délka je volitelný a představuje velikost vyrovnávací paměti, což je počet kousnutí uložených v paměti během procesu kopírování. Tato možnost může být užitečná při kopírování velmi velkých souborů, protože může urychlit proces kopírování a zabránit nekontrolovanému využití paměti.

například následující kód zkopíruje “ soubor1.txt „do“ souboru5.txt“

import shutilfilename1 = 'file1.txt'fileA = open(filename1, 'rb')filename2 = 'file5.txt'fileB = open(filename2, 'wb')shutil.copyfileobj(fileA, fileB)

Jak můžeme vidět, aby bylo možné používat copyfileobj, musíme otevřít soubory v binárním režimu (což je díl „b“ „rb“ a „wb“). Kromě toho musí být zdrojový soubor otevřen jako čitelný a cílový soubor musí být otevřen jako zapisovatelný (části“ r „A“ w“).

kopírování souborů pomocí modulu os

modul os poskytuje způsob, jak používat funkce operačního systému ke kopírování souborů. Ve většině (ne-li všech) příkladů odtud uvádíme příklady, které fungují pro Windows i Unix. Příklady se liší kvůli použitým příkazům shellu, proto věnujte pozornost tomu, jak je každé volání funkce označeno v komentářích Pythonu.

popen

tato metoda otevře potrubí do nebo z vašeho příkazu. Všimněte si však, že tato metoda byla v Pythonu 2.6 zastaralá, takže ji nedoporučujeme používat, pokud nebudete muset. Jako alternativu nám dokumentace Pythonu doporučuje místo toho použít metody z modulu podprocesu.

syntaxe je následující:

os.popen(cmd])

Tady vrácená hodnota je objekt souboru, který je připojen k potrubí. Tento objekt lze číst nebo zapisovat do V závislosti na režimu. Výchozí režim je „r“, který umožňuje čtení obsahu souboru.

níže uvedený příklad zkopíruje “ soubor1.txt „do“ souboru6.txt“:

import os# Windowsos.popen('copy file1.txt file6.txt')# Unixos.popen('cp file1.txt file6.txt')

spuštění příkazu tímto způsobem, je to přesně stejné, jako kdybyste běžel přímo z příkazového řádku terminálu.

system

tato metoda provede zadaný příkaz v subshell. Je k dispozici pro Unix i Windows. Syntaxe je následující:

os.system(command)

Zde command je řetězec obsahující DOS nebo Unix shell příkaz. V našem případě zde vložíme příkaz copy nebo cp.

například následující kód zkopíruje “ soubor1.txt „do“ souboru7.txt“

import os# Windowsos.system('copy file1.txt file7.txt')# Unixos.system('cp file1.txt file7.txt')

vypadá To identické s předchozí os.popen příkaz jsme právě použili, ale příkaz je proveden v podslupce, což znamená, že je spuštěn v samostatném vlákně v paralelně, aby vaše provádění kódu. Chcete-li počkat na jeho dokončení, musíte zavolat .wait() na objekt vrácený os.system.

Kopírování Souborů s subprocess Modulu

modul subprocess hodlá nahradit některé metody v os module (zejména os.systemos.spawn* metody), a to představuje dvě hlavní metody pro přístup k operační systém příkazů. Tyto metody jsou call a check_output. Opět platí, že pro systémy Unix příkaz “ Kopírovat soubor1.txt soubor2.txt “ by měl být nahrazen „CP soubor1.txt soubor2.txt“.

metoda volání

dokumentace Pythonu nám doporučuje použít metodu call pro spuštění příkazu z operačního systému.

syntaxe je následující:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

args parametr bude obsahovat náš příkaz shellu. Nicméně, slovo opatrnosti, protože dokumentace Pythonu nás varuje, že použití shell=True může být bezpečnostním rizikem.

pomocí tohoto volání funkce můžeme spustit příkaz kopírování následujícím způsobem:

import subprocess# Windowsstatus = subprocess.call('copy file1.txt file8.txt', shell=True)# Unixstatus = subprocess.call('cp file1.txt file8.txt', shell=True)

jak ukazuje výše uvedený příklad, musíme jednoduše předat řetězec příkazem shell, jako dříve.

a podle očekávání operační systém zkopíruje “ soubor1.txt “ do souboru s názvem „file8.txt“.

metoda check_output

tato metoda nám také umožňuje provést příkaz v shellu. Je to velmi podobné příkazu subprocess.run, kromě toho, že ve výchozím nastavení vysílá data ze stdout jako kódované bajty. Syntaxe je následující:

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

zde parametr args obsahuje příkaz shellu, který chceme použít. Dokumentace Pythonu nás opět varuje před použitím shell=True, proto tuto metodu používejte opatrně.

v následujícím kódu zkopírujeme “ soubor1.txt “ do “ soubor9.txt“ pomocí check_output příkaz:

import subprocess# Windowsstatus = subprocess.check_output('copy file1.txt file9.txt', shell=True)# Unixstatus = subprocess.check_output('cp file1.txt file9.txt', shell=True)

A jak se všechny příkazy, které jsme ukázali v tomto článku, to bude zkopírujte soubor „soubor1.txt “ do cíle, který jsme zadali, což je „file9.txt “ zde.

zabalení

Python nám nabízí mnoho různých způsobů kopírování souborů, z nichž některé jsou součástí sady metod Pythonu. Jiní používají některé z Python je mocný metody, spouštět příkazy v shellu, které používají příkazy shellu jako copy nebo cp.

nejste si jisti, který z nich je pro vás ten pravý? Představili jsme zde mnoho různých způsobů kopírování souborů, takže je to pochopitelné. Metoda, kterou používáte ke kopírování souboru, je zcela na vás a bude záviset na vašich konkrétních potřebách. I když ve většině případů jeden z příkazů shutil bude pro vás fungovat dobře. Zkuste začít s shutil.copy2 a zjistěte, zda to dělá to, co potřebujete.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *