introduktion
når det kommer til at bruge Python til at kopiere filer, er der to hovedmåder: brug afshutil
modulet elleros
modulet. Alle os
metoder, vi viser her, er metoder, der giver os mulighed for at udføre shell-kommandoer fra vores Python-kode, som vi bruger til at udføre copy
kommando (vinduer) eller cp
kommando (unik).
du vil bemærke, at mange af disse metoder, i bådeshutil
modulet ogos
modulet, har meget lignende funktionalitet (hvilket ikke burde være overraskende), men hver varierer i funktionalitet fra hinanden meget lidt, hvilket jeg også vil forklare.
kopiering af filer med Shutil-modulet
shutil-modulet tilbyder flere metoder på højt niveau til at kopiere filer. Her nedenfor er de vigtigste:
copyfile
denne metode kopierer indholdet af en fil til en anden fil. Den destination, der leveres til den, skal være en skrivbar fil og have et andet navn end kildefilen. Hvis navnene er de samme, vil det generere en fejl. Hvis destinationsfilen allerede findes, erstattes den med den nyligt kopierede fil.
syntaksen for denne metode er:
shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)
for eksempel kopierer følgende kode en fil med navnet “file1.tekst “i en fil med navnet” fil2.
import shutilshutil.copyfile('file1.txt', 'file2.txt')
et interessant og potentielt nyttigt træk ved shutil.copyfile
er follow_symlinks
boolsk argument. Hvis den er indstillet til False
, og kildefilen er et symbolsk link, oprettes der i stedet for at kopiere filen et nyt symbolsk link.
kopier
denne metode ligner megetcopyfile
, hvor den største forskel er, at den ud over at kopiere indholdet af kildefilen går et skridt videre og kopierer også filens filsystemtilladelser. Kopiering af filtilladelser er ikke en triviel opgave på de fleste programmeringssprog, så dette er en dejlig funktion at have.
syntaksen er som følger:
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
hver af disse parametre er de samme som icopyfile
metode. For eksempel kopierer følgende kode “fil1.tekst ” ind ” fil3.tekst”.
import shutilshutil.copy('file1.txt', 'file3.txt')
Bemærk: Sørg for, at du ikke navngiver dit script det samme som et af det modul, du importerer (hvilket jeg fejlagtigt gjorde, da jeg testede kode for denne artikel). Hvis du gør det, får du en fejl, når du prøver at importere dette modul på grund af et cirkulært importproblem.
copy2
som med de tidligere metoder,copy2
metoden er identisk medcopy
metoden, men ud over at kopiere filindholdet forsøger den også at bevare alle kildefilens metadata. Hvis platformen ikke tillader fuld metadatabesparelse, returnerer copy2
ikke fejl, og det vil bare bevare alle metadata, det kan.
syntaksen er som følger:
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
igen er disse parametre de samme som i de tidligere kommandoer, vi har nævnt hidtil.
for eksempel kopierer følgende kode “fil1.tekst ” ind ” fil4.tekst”, samt bevare metadataene for den oprindelige fil, ” fil1.tekst”.
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
som vi kan se fra at udføre vores kode ovenfor, ” file1.tekst “blev kopieret til” fil4.tekst”. Du har dog måske bemærket, at oprettelsesdatoen blev bevaret på den nye fil, i modsætning til shutil.copy
, som kopierede “file1.tekst ” til ” fil3.”og gav det en ny oprettelsesdato.
copyfileobj
denne metode kopierer indholdet af en kildefil til en destinationsfil fra den aktuelle kildefilposition. Hvad dette betyder er, at hvis du læser data fra dit kildefilobjekt, så er den position, du holder op med at læse på, positionen copyfileobj
begynder at kopiere fra.
syntaksen er som følger:
shutil.copyfileobj(src_file_object, dest_file_object)
betydningen af kilde-og destinationsfilparametre ligner de tidligere kommandoer, men nu henviser de til objekter. Længdeparameteren er valgfri og repræsenterer bufferstørrelsen, der er antallet af bid, der opbevares i hukommelsen under kopieringsprocessen. Denne mulighed kan være nyttig, når du kopierer meget store filer, da den kan fremskynde kopieringsprocessen og undgår ukontrolleret hukommelsesbrug.
for eksempel kopierer følgende kode ” fil1.tekst ” ind ” fil5.”
import shutilfilename1 = 'file1.txt'fileA = open(filename1, 'rb')filename2 = 'file5.txt'fileB = open(filename2, 'wb')shutil.copyfileobj(fileA, fileB)
Som vi kan se, for at bruge copyfileobj
, skal vi åbne filerne i binær tilstand (som er” b “- delen af” rb “og”VB”). Derudover skal kildefilen åbnes som læsbar, og destinationsfilen skal åbnes som skrivbar (henholdsvis “r” og “H” – delene).
kopiering af filer med os-modulet
os-modulet giver mulighed for at bruge operativsystemets funktionalitet til at kopiere dine filer. I de fleste (hvis ikke alle) af eksemplerne herfra giver vi eksempler, der fungerer for både vinduer og unik. Eksemplerne er forskellige på grund af de anvendte shell-kommandoer, så sørg for at være opmærksom på, hvordan hvert funktionsopkald er mærket i Python-kommentarerne.
popen
denne metode åbner et rør til eller fra din kommando. Bemærk dog, at denne metode blev udskrevet i Python 2.6, så vi anbefaler ikke at bruge den, medmindre du skal. Som et alternativ råder Python-dokumentationen os til at bruge metoder fra underprocesmodulet i stedet.
syntaksen er som følger:
os.popen(cmd])
Her er den returnerede værdi et filobjekt, der er forbundet til røret. Dette objekt kan læses fra eller skrives til afhængigt af tilstanden. Standardtilstanden er ‘r’, som tillader læsning af filindholdet.
eksemplet nedenfor kopierer ” fil1.tekst ” ind ” fil6.
import os# Windowsos.popen('copy file1.txt file6.txt')# Unixos.popen('cp file1.txt file6.txt')
at køre kommandoen på denne måde er nøjagtig den samme, som hvis du kørte den direkte fra kommandolinjen på din terminal.
system
denne metode udfører den angivne kommando i en underskal. Den er tilgængelig for både vinduer og vinduer. Syntaksen er som følger:
os.system(command)
Hercommand
er en streng, der indeholder kommandoen DOS eller unik shell. I vores tilfælde er det her, hvor vi sætter copy
ellercp
kommandoen.
for eksempel kopierer følgende kode “fil1.tekst ” ind ” fil7.”
import os# Windowsos.system('copy file1.txt file7.txt')# Unixos.system('cp file1.txt file7.txt')
dette ser identisk ud med den forrigeos.popen
kommando, vi lige har brugt, men kommandoen udføres i en underskal, hvilket betyder, at den udføres i en separat tråd parallelt med din udførelseskode. For at vente på færdiggørelsen skal du ringe .wait()
på objektet returneret af os.system
.
kopiering af filer med underprocesmodulet
underprocesmodulet har til hensigt at erstatte nogle metoder ios
modulet (isæros.system
ogos.spawn*
metoder), og det præsenterer to hovedmetoder til at få adgang til operativsystemkommandoerne. Disse metoder er call
og check_output
. Endnu en gang, for unikke systemer, kommandoen “Kopier fil1.tekstfil2.tekst “skal erstattes af” cp-fil1.tekstfil2.tekst”.
opkaldsmetode
Python-dokumentationen anbefaler os at brugecall
– metoden til at starte en kommando fra operativsystemet.
syntaksen er som følger:
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
args
parameteren vil omfatte vores shell-kommando. Et ord med forsigtighed, da Python-dokumentationen advarer os om, at brug af shell=True
kan være en sikkerhedsrisiko.
ved hjælp af dette funktionsopkald kan vi køre vores kopikommando som følger:
import subprocess# Windowsstatus = subprocess.call('copy file1.txt file8.txt', shell=True)# Unixstatus = subprocess.call('cp file1.txt file8.txt', shell=True)
som eksemplet ovenfor viser, skal vi simpelthen passere en streng med shell-kommandoen som før.
og som forventet kopierer operativsystemet ” fil1.tekst “ind i en fil med navnet” fil8.tekst”.
check_output metode
denne metode giver os også mulighed for at udføre en kommando i en skal. Det ligner meget subprocess.run
kommando, bortset fra at det som standard rør data fra stdout som kodede byte. Syntaksen er som følger:
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
Herargs
parameteren indeholder den shell-kommando, vi vil bruge. Endnu en gang advarer Python-dokumentationen os om at bruge shell=True
, så brug denne metode med forsigtighed.
i den følgende kode kopierer vi ” fil1.tekst ” til ” fil9.”ved hjælp af kommandoen check_output
:
import subprocess# Windowsstatus = subprocess.check_output('copy file1.txt file9.txt', shell=True)# Unixstatus = subprocess.check_output('cp file1.txt file9.txt', shell=True)
og som med alle de kommandoer, vi har vist i denne artikel, kopierer dette filen ” fil1.tekst “til den destination, vi har angivet, hvilket er” fil9.tekst ” her.
indpakning
Python tilbyder os mange forskellige måder at kopiere filer på, hvoraf nogle er en del af Python-sæt af metoder. Andre bruger nogle af Pythons kraftfulde metoder til at udføre kommandoer i en skal, der bruger shell-kommandoer som copy
eller cp
.
Ikke sikker på, hvilken der passer til dig? Vi præsenterede mange forskellige måder at kopiere filer på her, så det er forståeligt. Den metode, du bruger til at kopiere en fil, er helt op til dig og afhænger af dine specifikke behov. Selvom en af shutil
kommandoer i de fleste tilfælde fungerer fint for dig. Prøv at starte med shutil.copy2
og se om det gør hvad du har brug for.