Hogyan másolni egy fájlt Python

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 copy2mó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 copyvagy 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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük