Slik Kopierer Du En Fil I Python

Introduksjon

når Det gjelder Å bruke Python til å kopiere filer, er det to hovedveier: bruk shutil modulen eller os modulen. Alleos metodene vi viser her er metoder som tillater oss å utføre skallkommandoer fra Vår Python-kode, som vi bruker til å utførecopy kommandoen (Windows) ellercp kommandoen (Unix).

du vil legge merke til at mange av disse metodene, i både shutil modulen ogos modulen, har svært lik funksjonalitet (som ikke bør være overraskende), men hver varierer i funksjonalitet fra hverandre veldig litt, som jeg også skal forklare.

Kopiere Filer med shutil-Modulen

shutil-modulen tilbyr flere metoder på høyt nivå for å kopiere filer. Her er de viktigste:

copyfile

denne metoden kopierer innholdet i en fil til en annen fil. Målet som er oppgitt, må være en skrivbar fil og ha et annet navn enn kildefilen. Hvis navnene er de samme, vil det generere en feil. Hvis målfilen allerede finnes, vil den bli erstattet med den nylig kopierte filen.syntaksen for denne metoden er:

shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)

for eksempel vil følgende kode kopiere en fil med navnet «fil1.txt «inn i en fil som heter» fil2.txt»:

import shutilshutil.copyfile('file1.txt', 'file2.txt')

en interessant og potensielt nyttig funksjon i shutil.copyfile erfollow_symlinks Boolsk argument. Hvis den er satt til False, og kildefilen er en symbolsk lenke, blir det i stedet for å kopiere filen opprettet en ny symbolsk lenke.

copy

denne metoden ligner veldig på copyfile, med hovedforskjellen at i tillegg til å kopiere innholdet i kildefilen, går det et skritt videre og kopierer også filens filsystemtillatelser. Kopiering av filtillatelser er ikke en triviell oppgave i de fleste programmeringsspråk, så dette er en fin funksjon å ha.

syntaksen er som følger:

shutil.copy(src_file, dest_file, *, follow_symlinks=True)

Hver av disse parameterne er de samme som icopyfile – metoden. For eksempel vil følgende kode kopiere «file1.txt «inn i» fil3.txt».

import shutilshutil.copy('file1.txt', 'file3.txt')

Merk: Pass På at du ikke navngir skriptet ditt det samme som en av modulen du importerer (som jeg feilaktig gjorde da jeg testet kode for denne artikkelen). Hvis du gjør det, får du en feil når du prøver å importere den modulen på grunn av et sirkulært importproblem.

copy2

som med de tidligere metodene, copy2metoden er identisk med copy metoden, men i tillegg til å kopiere filinnholdet forsøker den også å bevare all kildefilens metadata. Hvis plattformen ikke tillater full metadatabesparelse, returnerer copy2 ikke feil, og det vil bare bevare metadata det kan.

syntaksen er som følger:

shutil.copy2(src_file, dest_file, *, follow_symlinks=True)

igjen er disse parameterne de samme som i de tidligere kommandoene vi har nevnt så langt.

for eksempel vil følgende kode kopiere «file1.txt «inn i» fil4.txt», samt bevare metadataene til den opprinnelige filen, «fil1.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

som vi kan se fra å utføre koden vår ovenfor, «file1.txt «ble kopiert til» file4.txt». Du har imidlertid kanskje lagt merke til at opprettelsesdatoen ble bevart på den nye filen, i motsetning til med shutil.copy, som kopierte » file1.txt » til » fil3.txt » og ga det en ny opprettelsesdato.

copyfileobj

denne metoden kopierer innholdet i en kildefil til en målfil, fra gjeldende kildefilposisjon. Hva dette betyr er at hvis du leser data fra kildefilobjektet, er posisjonen du slutter å lese på, posisjonen copyfileobj begynner å kopiere fra.

syntaksen er som følger:

shutil.copyfileobj(src_file_object, dest_file_object)

betydningen av kilde-og målfilparametere ligner de forrige kommandoene, men nå refererer de til objekter. Lengdeparameteren er valgfri og representerer bufferstørrelsen som er antall biter som holdes i minnet under kopieringsprosessen. Dette alternativet kan være nyttig når du kopierer svært store filer, da det kan øke hastigheten på kopieringsprosessen og unngår ukontrollert minnebruk.

for eksempel følgende kode vil kopiere «file1.txt «inn i» fil5.txt «

import shutilfilename1 = 'file1.txt'fileA = open(filename1, 'rb')filename2 = 'file5.txt'fileB = open(filename2, 'wb')shutil.copyfileobj(fileA, fileB)

Som vi kan se, for å kunne bruke copyfileobj, må vi åpne filene i binær modus (som er «b» – delen av «rb» og «wb»). I tillegg må kildefilen åpnes som lesbar og målfilen må åpnes som skrivbar (henholdsvis» r «og» w » – delene).

Kopiere Filer med os-Modulen

os-modulen gir en måte å bruke operativsystemfunksjonaliteten til å kopiere filene dine. I de fleste (om ikke alle) eksemplene herfra gir vi eksempler som fungerer for Både Windows og Unix. Eksemplene er forskjellige på grunn av shell-kommandoene som brukes, så vær sikker på å være oppmerksom på hvordan hvert funksjonskall er merket i Python-kommentarene.

popen

denne metoden åpner et rør til eller fra din kommando. Vær imidlertid oppmerksom på at denne metoden ble avskrevet I Python 2.6, så vi anbefaler ikke å bruke den med mindre du må. Som et alternativ anbefaler Python-dokumentasjonen oss å bruke metoder fra delprosessmodulen i stedet.

syntaksen er som følger:

os.popen(cmd])

her er verdien returnert et filobjekt som er koblet til røret. Dette objektet kan leses fra eller skrives til, avhengig av modusen. Standardmodus er ‘r’, som tillater lesing av filinnholdet.

eksemplet nedenfor vil kopiere » file1.txt «inn i» file6.txt»:

import os# Windowsos.popen('copy file1.txt file6.txt')# Unixos.popen('cp file1.txt file6.txt')

Å Kjøre kommandoen på denne måten er akkurat det samme som om du kjørte den direkte fra kommandolinjen til terminalen din.

system

denne metoden utfører den angitte kommandoen i et underskall. Den er tilgjengelig For Både Unix og Windows. Syntaksen er som følger:

os.system(command)

Her command er en streng som inneholder KOMMANDOEN DOS eller Unix shell. I vårt tilfelle er dette hvor vi legger kommandoencopy ellercp.

for eksempel vil følgende kode kopiere «file1.txt «inn i» fil7.txt»

import os# Windowsos.system('copy file1.txt file7.txt')# Unixos.system('cp file1.txt file7.txt')

dette ser identisk ut med den forrigeos.popen kommandoen vi nettopp brukte, men kommandoen utføres i et underskall, noe som betyr at den utføres i en egen tråd parallelt med utførelseskoden din. For å vente på ferdigstillelsen må du ringe .wait() på objektet returnert av os.system.

Kopiere Filer med Delprosessmodulen

delprosessmodulen har til hensikt å erstatte noen metoder ios modulen (spesieltos.system ogos.spawn* metoder), og den presenterer to hovedmetoder for å få tilgang til operativsystemkommandoene. Disse metodene er call og check_output. Igjen, For Unix-systemer, kommandoen » kopier fil1.txt file2.txt «skal erstattes av» cp file1.txt file2.txt».

anropsmetode

Python-dokumentasjonen anbefaler oss å bruke call – metoden for å starte en kommando fra operativsystemet.

syntaksen er som følger:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

parameterenargs vil inkludere vår shell-kommando. Men et ord av forsiktighet, som Python-dokumentasjonen advarer oss om at bruk av shell=True kan være en sikkerhetsrisiko.

Ved hjelp av denne funksjonsanropet kan vi kjøre vår kopieringskommando 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, trenger vi bare å passere en streng med shell-kommandoen, som før.

og som forventet vil operativsystemet kopiere » fil1.txt «inn i en fil som heter» fil8.txt».

check_output Metode

denne metoden tillater oss også å utføre en kommando i et skall. Det er veldig mye som kommandoen subprocess.run, bortsett fra at det som standard rør data fra stdout som kodet byte. Syntaksen er som følger:

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

her inneholderargs parameteren shell-kommandoen vi vil bruke. Igjen advarer Python-dokumentasjonen oss om å bruke shell=True, så bruk denne metoden med forsiktighet.

i følgende kode kopierer vi » file1.txt » til » file9.txt»bruke check_output kommandoen:

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 kommandoene vi har vist i denne artikkelen, vil dette kopiere filen «file1.txt «til destinasjonen vi angav, som er» file9.txt » her.

Innpakning

Python gir oss mange forskjellige måter å kopiere filer på, hvorav noen er en del av Python-settet med metoder. Andre bruker Noen Av Pythons kraftige metoder for å utføre kommandoer i et skall, som bruker skallkommandoer som copy eller cp.

Ikke sikker på hvilken som er riktig for deg? Vi presenterte mange forskjellige måter å kopiere filer på her, så det er forståelig. Metoden du bruker til å kopiere en fil er helt opp til deg og vil avhenge av dine spesifikke behov. Selv om en av shutil – kommandoene i de fleste tilfeller vil fungere bra for deg. Prøv å starte med shutil.copy2 og se om det gjør det du trenger.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *