Johdanto
kun Pythonia käytetään tiedostojen kopioimiseen, on olemassa kaksi päätapaa: shutil
moduuli tai os
moduuli. Kaikki tässä esitetyt os
menetelmät ovat menetelmiä, joiden avulla voimme suorittaa komentotulkin komentoja Python-koodistamme, jota käytämme copy
komento (Windows) tai cp
komento (Unix).
huomaat, että monet näistä menetelmistä, sekä shutil
moduuli ja os
moduuli, ovat hyvin samanlaisia (mikä ei pitäisi olla yllättävää), mutta kummankin toiminnallisuus vaihtelee hieman toisistaan, minkä selitän myös.
tiedostojen kopiointi shutil-moduulilla
shutil-moduuli tarjoaa useita korkean tason menetelmiä tiedostojen kopioimiseen. Tässä alla tärkeimmät:
copyfile
tämä menetelmä kopioi yhden tiedoston sisällön toiseen tiedostoon. Sille annetun määränpään on oltava kirjoitettava tiedosto, ja sillä on oltava eri nimi kuin lähdetiedostolla. Jos nimet ovat samat, se tuottaa virheen. Jos kohdetiedosto on jo olemassa, se korvataan vasta kopioidulla tiedostolla.
tämän menetelmän syntaksi on:
shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)
esimerkiksi seuraava koodi kopioi tiedoston nimeltä ”file1.txt ”tiedostoon nimeltä” tiedosto2.txt”:
import shutilshutil.copyfile('file1.txt', 'file2.txt')
yksi kiinnostava ja mahdollisesti hyödyllinen ominaisuus shutil.copyfile
on follow_symlinks
Boolen argumentti. Jos sen arvo on False
ja lähdetiedosto on symbolinen linkki, tiedoston kopioinnin sijaan luodaan uusi symbolinen linkki.
kopioi
tämä menetelmä on hyvin samankaltainen kuin copyfile
, ja suurin ero on siinä, että lähdetiedoston sisällön kopioimisen lisäksi se menee askeleen pidemmälle ja kopioi myös tiedoston tiedostojärjestelmän käyttöoikeudet. Tiedostojen käyttöoikeuksien kopiointi ei ole vähäpätöinen tehtävä useimmissa ohjelmointikielissä,joten tämä on mukava ominaisuus.
syntaksi on seuraava:
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
jokainen näistä parametreista on sama kuin copyfile
– menetelmässä. Esimerkiksi seuraava koodi kopioi ”file1.txt ”into” tiedosto3.txt”.
import shutilshutil.copy('file1.txt', 'file3.txt')
Huom: varmista, ettet nimeä komentosarjaasi samalla tavalla kuin yhtä tuomaasi moduulia (jonka tein vahingossa testatessani koodia tälle artikkelille). Jos et, niin saat virheen, kun yrität tuoda että moduuli johtuu Pyöreä tuonti ongelma.
copy2
edellisten menetelmien tapaan copy2
menetelmä on sama kuin copy
menetelmä, mutta tiedoston sisällön kopioinnin lisäksi se pyrkii myös säilyttämään kaikki lähdetiedoston metatiedot. Jos alusta ei salli täydellistä metatiedon tallentamista, niin copy2
ei palauta virhettä ja se vain säilyttää kaikki metatiedot, jotka se voi.
syntaksi on seuraava:
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
taas nämä parametrit ovat samat kuin aiemmissa tähän mennessä mainitsemissamme komennoissa.
esimerkiksi seuraava koodi kopioi ”file1.txt ”into” tiedosto4.txt”, sekä säilyttää alkuperäisen tiedoston metatiedot, ” 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
kuten yllä olevasta koodistamme voi päätellä”, tiedosto1.txt ”kopioitiin” tiedostoon4.txt”. Olet kuitenkin saattanut huomata luomispäivän säilyneen uudessa tiedostossa, toisin kuin shutil.copy
, joka kopioi ”tiedosto1.txt ” to ” tiedosto3.txt ” ja antoi sille uuden luomispäivän.
copyfileobj
tämä menetelmä kopioi lähdetiedoston sisällön kohdetiedostoksi nykyisestä lähdetiedoston sijainnista. Tämä tarkoittaa sitä, että jos luet lähdetiedoston objektin tietoja, niin asema, johon lopetat lukemisen, on asema copyfileobj
alkaa kopioida siitä.
syntaksi on seuraava:
shutil.copyfileobj(src_file_object, dest_file_object)
lähde-ja kohdetiedoston parametrien merkitykset ovat samanlaisia kuin aiemmissa komennoissa, mutta nyt ne viittaavat olioihin. Pituusparametri on valinnainen ja kuvaa puskurikokoa, joka on muistiin tallennettujen puremien määrä kopiointiprosessin aikana. Tämä vaihtoehto voi olla hyödyllinen hyvin suuria tiedostoja kopioidessa, koska se voi nopeuttaa kopiointiprosessia ja välttää hallitsemattoman muistin käytön.
esimerkiksi seuraava koodi kopioi ”file1.txt ”into” file5.txt”
import shutilfilename1 = 'file1.txt'fileA = open(filename1, 'rb')filename2 = 'file5.txt'fileB = open(filename2, 'wb')shutil.copyfileobj(fileA, fileB)
käyttääksemme copyfileobj
tiedostot on avattava binääritilassa (joka on” RB”: n ja” wb”: n”B” – osa). Lisäksi lähdetiedosto on avattava luettavana ja kohdetiedosto kirjoitettavana (”r” – ja ”w” – osat).
tiedostojen kopiointi os-moduulilla
os-moduuli tarjoaa tavan käyttää käyttöjärjestelmän toimintoja tiedostojen kopioimiseen. Useimmissa (ellei kaikissa) esimerkeissä tästä eteenpäin tarjoamme esimerkkejä, jotka toimivat sekä Windowsille että Unixille. Esimerkit ovat erilaisia käytettyjen komentotulkkikomentojen vuoksi, joten muista kiinnittää huomiota siihen, miten kukin funktiokutsu on merkitty Python-kommenteissa.
popen
tämä menetelmä avaa putken komennolle tai komennosta. Huomaa kuitenkin, että tämä menetelmä on vanhentunut Python 2.6: ssa, joten emme suosittele sen käyttöä, ellei ole pakko. Vaihtoehtoisesti Python-dokumentaatio neuvoo käyttämään sen sijaan aliprosessointimoduulin menetelmiä.
syntaksi on seuraava:
os.popen(cmd])
tässä palautettu arvo on putkeen liitetty tiedostoobjekti. Tämä objekti voidaan lukea tai kirjoittaa riippuen tilasta. Oletustila on ”r”, joka mahdollistaa tiedoston sisällön lukemisen.
alla olevassa esimerkissä kopioidaan ”file1.txt ”into” tiedosto6.txt”:
import os# Windowsos.popen('copy file1.txt file6.txt')# Unixos.popen('cp file1.txt file6.txt')
komennon suorittaminen tällä tavalla on täsmälleen sama kuin jos ajaisit sen suoraan päätteesi komentoriviltä.
järjestelmä
tämä menetelmä suorittaa määritetyn komennon alikuoressa. Se on saatavilla sekä Unixille että Windowsille. Syntaksi on seuraava:
os.system(command)
tässä command
on merkkijono, joka sisältää DOS-tai Unix shell-komennon. Meidän tapauksessamme tähän laitetaan copy
tai cp
komento.
esimerkiksi seuraava koodi kopioi ”file1.txt ”into” file7.txt”
import os# Windowsos.system('copy file1.txt file7.txt')# Unixos.system('cp file1.txt file7.txt')
Tämä näyttää identtiseltä edellisen os.popen
komennon kanssa, jota juuri käytimme, mutta komento suoritetaan alikuoressa, eli se suoritetaan erillisenä säkeenä suorituskoodin rinnalla. Sen valmistumista odottaessa on soitettava .wait()
os.system
palauttamalle kohteelle.
tiedostojen kopiointi aliprosessomoduulilla
aliprosessomoduuli aikoo korvata joitakin menetelmiä os
moduulissa (erityisesti os.system
ja os.spawn*
menetelmät), ja se esittää kaksi pääasiallista tapaa käyttää käyttöjärjestelmän komentoja. Nämä menetelmät ovat call
ja check_output
. Jälleen kerran Unix-järjestelmille komento ” kopioi tiedosto1.txt tiedosto2.txt ”olisi korvattava” cp file1.txt tiedosto2.txt”.
kutsumenetelmä
Python-dokumentaatio suosittelee käyttämään call
– menetelmää komennon käynnistämiseksi käyttöjärjestelmästä.
syntaksi on seuraava:
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
args
parametri sisältää komentotulkin komennon. Varoituksen sana on kuitenkin paikallaan, sillä Python-dokumentaatio varoittaa, että shell=True
käyttäminen voi olla tietoturvariski.
käyttämällä tätä funktiokutsua voimme suorittaa kopiointikomennon seuraavasti:
import subprocess# Windowsstatus = subprocess.call('copy file1.txt file8.txt', shell=True)# Unixstatus = subprocess.call('cp file1.txt file8.txt', shell=True)
kuten yllä oleva esimerkki osoittaa, meidän on yksinkertaisesti läpäistävä merkkijono komentotulkin avulla, kuten ennenkin.
ja odotetusti käyttöjärjestelmä kopioi ”file1.txt ”tiedostoon nimeltä” file8.txt”.
check_output Method
tämä menetelmä mahdollistaa myös komennon suorittamisen komentotulkin sisällä. Se muistuttaa hyvin paljon subprocess.run
– käskyä, paitsi että oletusarvoisesti se putkittaa tiedot stdoutista koodattuina tavuina. Syntaksi on seuraava:
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
tässä args
parametri sisältää komentotulkin, jota haluamme käyttää. Jälleen kerran Python-dokumentaatio varoittaa käyttämästä shell=True
, joten käytä tätä menetelmää varoen.
seuraavassa koodissa kopioidaan ”tiedosto1.txt ” to ” file9.txt ”käyttäen check_output
komento:
import subprocess# Windowsstatus = subprocess.check_output('copy file1.txt file9.txt', shell=True)# Unixstatus = subprocess.check_output('cp file1.txt file9.txt', shell=True)
ja kuten kaikki tässä artikkelissa esitetyt komennot, tämä kopioi tiedoston ” tiedosto1.txt ” määrittämäämme kohteeseen, joka on ”file9.txt ” tässä.
Python tarjoaa monia erilaisia tapoja kopioida tiedostoja, joista osa kuuluu Pythonin menetelmäjoukkoon. Toiset käyttävät Pythonin tehomenetelmiä komentojen suorittamiseen komentotulkilla, jotka hyödyntävät komentotulkin komentoja, kuten copy
tai cp
.
Etkö ole varma, kumpi sopii sinulle? Esitimme paljon erilaisia tapoja kopioida tiedostoja täällä, joten se on ymmärrettävää. Menetelmä, jolla kopioit tiedoston, on täysin sinun päätettävissä ja riippuu erityistarpeistasi. Vaikka useimmissa tapauksissa jokin shutil
komennoista toimii sinulle ihan hyvin. Kokeile aloittaa shutil.copy2
ja katso, tekeekö se mitä tarvitset.