Bevezetés
amikor a Python fájlok másolása, két fő módja van: a shutil
modul vagy a os
modul. A os
módszereket mutatjuk itt vannak módszerek, amelyek lehetővé teszik számunkra, hogy végre shell parancsokat a Python kódot, amelyet használni fogjuk végrehajtani, hogy a copy
parancs (Windows) vagy a cp
parancs (Unix).
észre fogod venni, hogy sok ilyen módszer, mind a shutil
modul, mind a os
modul nagyon hasonló funkcionalitással rendelkezik (ami nem meglepő), de mindegyik funkcionalitásban nagyon kissé változik egymástól, amit én is elmagyarázok.
fájlok másolása a shutil modullal
a shutil modul számos magas szintű módszert kínál a fájlok másolására. Itt vannak a legfontosabbak:
copyfile
Ez a módszer másolja az egyik fájl tartalmát egy másik fájlba. A megadott célnak írható fájlnak kell lennie, és más névvel kell rendelkeznie, mint a forrásfájl. Ha a nevek ugyanazok, akkor hibát generál. Ha a célfájl már létezik, akkor azt az újonnan másolt fájl váltja fel.
ennek a módszernek a szintaxisa:
shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)
például a következő kód másolja a “file1″ nevű fájlt.txt ” egy file2 nevű fájlba.txt”:
import shutilshutil.copyfile('file1.txt', 'file2.txt')
a shutil.copyfile
egyik érdekes és potenciálisan hasznos tulajdonsága a follow_symlinks
Boolean argumentum. Ha False
értékre van állítva, a forrásfájl pedig szimbolikus link, akkor a fájl másolása helyett új szimbolikus link jön létre.
copy
Ez a módszer nagyon hasonlít a copyfile
– hoz, azzal a fő különbséggel, hogy a forrásfájl tartalmának másolása mellett egy lépéssel tovább megy, és átmásolja a fájlrendszer engedélyeit is. A fájlengedélyek másolása a legtöbb programozási nyelvben nem triviális feladat,ezért ez egy szép funkció.
a szintaxis a következő:
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
mindegyik paraméter megegyezik a copyfile
módszerrel. Például a következő kód másolja a “file1.txt ” be ” file3.txt”.
import shutilshutil.copy('file1.txt', 'file3.txt')
Megjegyzés: ügyeljen arra, hogy ne nevezze el a szkriptet ugyanúgy, mint az importáló modul egyikét (amit tévesen tettem a cikk kódjának tesztelésekor). Ha igen, akkor hibát fog kapni, amikor megpróbálja importálni a modult egy körkörös importálási probléma miatt.
copy2
az előző módszerekhez hasonlóan a copy2
módszer megegyezik a copy
módszerrel, de a fájl tartalmának másolása mellett megpróbálja megőrizni az összes forrásfájl metaadatát is. Ha a platform nem teszi lehetővé a teljes metaadat-mentést, akkor a copy2
nem ad vissza hibát, csak megőrzi a metaadatokat.
a szintaxis a következő:
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
ismét ezek a paraméterek ugyanazok, mint az eddig említett korábbi parancsokban.
például a következő kód másolja a “file1.txt ” be ” file4.txt”, valamint megőrzi az eredeti fájl metaadatait, ” 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
amint azt a fenti kódunk végrehajtásából láthatjuk, ” file1.a “TXT” – t “file4″ – re másolták.txt”. Előfordulhat azonban, hogy észrevette, hogy a létrehozás dátuma megmaradt az új fájlban, ellentétben a shutil.copy
fájllal, amely a “file1″ – et másolta.txt ” to ” file3.txt ” és adott neki egy új alkotási dátumot.
copyfileobj
Ez a módszer másolja a forrásfájl tartalmát egy célfájlba, az aktuális forrásfájl pozícióból. Ez azt jelenti, hogy ha adatokat olvas a forrásfájl objektumából, akkor az a pozíció, ahol abbahagyja az olvasást, a copyfileobj
pozíció, ahonnan másolni kezd.
a szintaxis a következő:
shutil.copyfileobj(src_file_object, dest_file_object)
a forrás-és célfájl-paraméterek jelentése hasonló az előző parancsokhoz, de most objektumokra utalnak. A hossz paraméter opcionális, a puffer méretét jelenti, amely a másolási folyamat során a memóriában tárolt harapások száma. Ez az opció nagyon nagy fájlok másolásakor lehet hasznos, mivel felgyorsíthatja a másolási folyamatot, és elkerülheti az ellenőrizetlen memóriahasználatot.
például a következő kód másolja a “file1.txt ” be ” file5.txt ”
import shutilfilename1 = 'file1.txt'fileA = open(filename1, 'rb')filename2 = 'file5.txt'fileB = open(filename2, 'wb')shutil.copyfileobj(fileA, fileB)
amint láthatjuk, a copyfileobj
használatához bináris módban kell megnyitnunk a fájlokat (amely az “rb” és a “wb” “b”része). Ezenkívül a forrásfájlt olvashatóan kell megnyitni ,a célfájlt pedig írhatónak kell megnyitni (az” r”, illetve a” w ” részeket).
fájlok másolása az operációs rendszer moduljával
az operációs rendszer modulja lehetővé teszi az operációs rendszer funkcióinak használatát a fájlok másolásához. A legtöbb (ha nem az összes) példában mostantól olyan példákat mutatunk be, amelyek mind a Windows, mind a Unix esetében működnek. A példák különbözőek a használt shell parancsok miatt, ezért ügyeljen arra, hogy figyeljen arra, hogy az egyes funkcióhívások hogyan vannak címkézve a Python megjegyzésekben.
popen
Ez a módszer megnyit egy csövet a parancshoz vagy onnan. Ne feledje azonban, hogy ez a módszer elavult a Python 2.6-ban,ezért nem javasoljuk a használatát, hacsak nem kell. Alternatív megoldásként a Python dokumentáció azt tanácsolja nekünk, hogy inkább az alfolyamat modul módszereit használjuk.
a szintaxis a következő:
os.popen(cmd])
itt a visszaküldött érték egy fájlobjektum, amely csatlakozik a csőhöz. Ez az objektum az üzemmódtól függően olvasható vagy írható. Az alapértelmezett mód az “r”, amely lehetővé teszi a fájl tartalmának olvasását.
az alábbi példa másolja a ” file1.txt ” be ” file6.txt”:
import os# Windowsos.popen('copy file1.txt file6.txt')# Unixos.popen('cp file1.txt file6.txt')
a parancs ilyen módon történő futtatása pontosan ugyanaz, mintha közvetlenül a terminál parancssorából futtatta volna.
system
Ez a módszer végrehajtja a megadott parancsot egy alhéjban. Mind a Unix, mind a Windows számára elérhető. A szintaxis a következő:
os.system(command)
itt command
a DOS vagy Unix shell parancsot tartalmazó karakterlánc. Esetünkben itt helyezzük el a copy
vagy cp
parancsot.
például a következő kód másolja a “file1.txt ” be ” file7.txt ”
import os# Windowsos.system('copy file1.txt file7.txt')# Unixos.system('cp file1.txt file7.txt')
Ez ugyanúgy néz ki, mint az előző os.popen
parancs, amelyet csak használtunk, de a parancs egy alhéjban kerül végrehajtásra, ami azt jelenti, hogy a végrehajtó kóddal párhuzamosan egy külön szálban kerül végrehajtásra. Ahhoz, hogy megvárja annak befejezését, fel kell hívnia a .wait()
– ot a os.system
által visszaküldött objektumra.
fájlok másolása a
alprocesszus modullal az alprocesszus modul a os
modul (különösen os.system
és a os.spawn*
metódusok) egyes módszereit kívánja lecserélni, és két fő módszert mutat be az operációs rendszer parancsainak eléréséhez. Ezek a módszerek: call
és check_output
. Ismét a Unix rendszereknél a “fájl másolása” parancs1.txt file2.a ” txt “helyébe a” cp file1 ” lép.txt file2.txt”.
hívásmódszer
a Python dokumentációja azt javasolja ,hogy a call
módszert használjuk az operációs rendszer parancsának elindításához.
a szintaxis a következő:
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
a args
paraméter tartalmazza a shell parancsot. Azonban egy óvatos szó, mivel a Python dokumentáció figyelmeztet bennünket, hogy a shell=True
használata biztonsági kockázat lehet.
ezzel a függvényhívással futtathatjuk a másolási parancsot az alábbiak szerint:
import subprocess# Windowsstatus = subprocess.call('copy file1.txt file8.txt', shell=True)# Unixstatus = subprocess.call('cp file1.txt file8.txt', shell=True)
ahogy a fenti példa mutatja, egyszerűen át kell adnunk egy karakterláncot a shell paranccsal, mint korábban.
és ahogy az várható volt, az operációs rendszer másolja a ” file1.txt ” egy file8 nevű fájlba.txt”.
check_output metódus
Ez a módszer lehetővé teszi egy parancs végrehajtását egy héjban. Nagyon hasonlít a subprocess.run
parancsra, kivéve, hogy alapértelmezés szerint az stdout adatait kódolt bájtként továbbítja. A szintaxis a következő:
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
itt a args
paraméter tartalmazza a használni kívánt shell parancsot. Ismét a Python dokumentáció figyelmeztet minket a shell=True
használatára, ezért óvatosan használja ezt a módszert.
a következő kódban a “file1″ – et másoljuk.txt ” to ” file9.txt”a check_output
parancs használatával:
import subprocess# Windowsstatus = subprocess.check_output('copy file1.txt file9.txt', shell=True)# Unixstatus = subprocess.check_output('cp file1.txt file9.txt', shell=True)
és mint az ebben a cikkben bemutatott összes parancs esetében, ez átmásolja a “file1” fájlt.txt “a megadott rendeltetési helyre, ami” file9.txt ” itt.
a Python számos különböző módszert kínál a fájlok másolására, amelyek közül néhány a Python módszerkészlet része. Mások a Python néhány erőteljes módszerét használják parancsok végrehajtására egy héjban, amelyek olyan shell parancsokat használnak, mint a copy
vagy cp
.
nem biztos benne, melyik az Ön számára megfelelő? Sok különböző módszert mutattunk be a fájlok másolására itt, így ez érthető. A fájl másolásához használt módszer teljesen rajtad múlik, az Ön egyedi igényeitől függ. Bár a legtöbb esetben az egyik shutil
parancs csak jól működik az Ön számára. Próbálja meg a shutil.copy2
kezdőbetűkkel kezdeni, és nézze meg, hogy ez megfelel-e Önnek.