Tiedoston kopiointi Pythonissa

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.systempalauttamalle 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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *