introduktion
När det gäller att använda Python för att kopiera filer finns det två huvudsakliga sätt: använda modulenshutil
elleros
. Allaos
metoder som vi visar här är metoder som gör att vi kan utföra skalkommandon från vår Python-kod, som vi använder för att köra kommandot copy
(Windows) eller cp
(Unix).
Du kommer att märka att många av dessa metoder, i bådeshutil
– modulen ochos
– modulen, har mycket liknande funktioner (vilket inte borde vara överraskande), men var och en varierar i funktionalitet från varandra väldigt lite, vilket jag också förklarar.
kopiera filer med shutil-modulen
shutil-modulen erbjuder flera metoder på hög nivå för att kopiera filer. Här nedan är de viktigaste:
copyfile
denna metod kopierar innehållet i en fil till en annan fil. Destinationen som tillhandahålls måste vara en skrivbar fil och ha ett annat namn än källfilen. Om namnen är desamma kommer det att generera ett fel. Om målfilen redan finns kommer den att ersättas med den nyligen kopierade filen.
syntaxen för denna metod är:
shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)
följande kod kopierar till exempel en fil med namnet ”file1.txt ”till en fil med namnet” file2.txt”:
import shutilshutil.copyfile('file1.txt', 'file2.txt')
en intressant och potentiellt användbar funktion i shutil.copyfile
är follow_symlinks
Booleska argument. Om den är inställd på False
, och källfilen är en symbolisk länk, skapas istället för att kopiera filen en ny symbolisk länk.
kopiera
denna metod är mycket lik copyfile
, med den största skillnaden är att förutom att kopiera innehållet i källfilen går det ett steg längre och kopierar också filens filsystembehörigheter. Kopiering av filbehörigheter är inte en trivial uppgift på de flesta programmeringsspråk, så det här är en trevlig funktion att ha.
syntaxen är som följer:
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
var och en av dessa parametrar är desamma som i copyfile
– metoden. Till exempel kopierar följande kod ”fil1.txt ”in” fil3.txt”.
import shutilshutil.copy('file1.txt', 'file3.txt')
Obs: se till att du inte namnger ditt skript på samma sätt som en av modulen du importerar (vilket jag felaktigt gjorde när jag testade kod för den här artikeln). Om du gör det får du ett fel när du försöker importera den modulen på grund av ett cirkulärt importproblem.
copy2
som med tidigare metoder är copy2
– metoden identisk med copy
– metoden, men förutom att kopiera filinnehållet försöker den också bevara all källfilens metadata. Om plattformen inte tillåter fullständig metadatabesparing, returnerar copy2
inte fel och det kommer bara att bevara alla metadata som den kan.
syntaxen är som följer:
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
återigen är dessa parametrar desamma som i de tidigare kommandona vi har nämnt hittills.
till exempel kopierar följande kod ”file1.txt ”in” fil4.txt”, samt bevara metadata för den ursprungliga filen, ” 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
som vi kan se från att utföra vår kod ovan, ” file1.txt ”kopierades till” fil4.txt”. Du kanske har märkt att skapningsdatumet bevarades på den nya filen, till skillnad från shutil.copy
, som kopierade ”file1.txt ”till” fil3.txt ” och gav det ett nytt skapningsdatum.
copyfileobj
denna metod kopierar innehållet i en källfil till en målfil, från den aktuella källfilens position. Vad detta betyder är att om du läser data från ditt källfilobjekt, är positionen du slutar läsa på positionen copyfileobj
börjar kopiera från.
syntaxen är som följer:
shutil.copyfileobj(src_file_object, dest_file_object)
betydelsen av käll-och målfilparametrar liknar de tidigare kommandona, men nu hänvisar de till objekt. Längdparametern är valfri och representerar buffertstorleken som är antalet bitar som hålls i minnet under kopieringsprocessen. Det här alternativet kan vara användbart när du kopierar mycket stora filer, eftersom det kan påskynda kopieringsprocessen och undviker okontrollerad minnesanvändning.
till exempel kopierar följande kod ”file1.txt ”in” 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, för att kunna använda copyfileobj
, måste vi öppna filerna i binärt läge (vilket är” b ”- delen av” rb ”och”wb”). Dessutom måste källfilen öppnas som läsbar och målfilen måste öppnas som skrivbar (delarna ”r” respektive ”w”).
kopiera filer med os-modulen
os-modulen ger ett sätt att använda operativsystemets funktionalitet för att kopiera dina filer. I de flesta (om inte alla) exemplen härifrån ger vi exempel som fungerar för både Windows och Unix. Exemplen är olika på grund av de skalkommandon som används, så var noga med att vara uppmärksam på hur varje funktionssamtal är märkt i Python-kommentarerna.
popen
denna metod öppnar ett rör till eller från ditt kommando. Observera dock att den här metoden var föråldrad i Python 2.6, så vi rekommenderar inte att du använder den om du inte måste. Som ett alternativ rekommenderar Python-dokumentationen oss att använda metoder från delprocessmodulen istället.
syntaxen är som följer:
os.popen(cmd])
här är värdet som returneras ett filobjekt som är anslutet till röret. Detta objekt kan läsas från eller skrivas till beroende på läge. Standardläget är ’r’, vilket gör det möjligt att läsa av filinnehållet.
exemplet nedan kopierar ” file1.txt ”in” fil6.txt”:
import os# Windowsos.popen('copy file1.txt file6.txt')# Unixos.popen('cp file1.txt file6.txt')
att köra kommandot på detta sätt är exakt detsamma som om du körde det direkt från kommandoraden på din terminal.
system
denna metod utför det angivna kommandot i ett underskal. Den är tillgänglig för både Unix och Windows. Syntaxen är som följer:
os.system(command)
Här command
är en sträng som innehåller DOS-eller Unix-skalkommandot. I vårt fall är det här vi lägger kommandot copy
eller cp
.
till exempel kopierar följande kod ”file1.txt ”in” fil7.Txt”
import os# Windowsos.system('copy file1.txt file7.txt')# Unixos.system('cp file1.txt file7.txt')
detta ser identiskt ut med föregående os.popen
kommando som vi just använde, men kommandot körs i ett underskal, vilket innebär att det körs i en separat tråd parallellt med din exekveringskod. För att vänta på att den är klar måste du ringa .wait()
på objektet som returneras av os.system
.
kopiera filer med Delprocessmodulen
delprocessmodulen avser att ersätta vissa metoder i modulen os
(särskilt os.system
och os.spawn*
metoder), och den presenterar två huvudmetoder för att komma åt operativsystemkommandon. Dessa metoder är call
och check_output
. Återigen, för Unix-system, kommandot ” Kopiera fil1.txt-fil2.txt ”ska ersättas med” cp file1.txt-fil2.txt”.
samtalsmetod
Python-dokumentationen rekommenderar oss att användacall
– metoden för att starta ett kommando från operativsystemet.
syntaxen är som följer:
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
args
parametern inkluderar vårt skalkommando. Men ett varningens ord, eftersom Python-dokumentationen varnar oss för att använda shell=True
kan vara en säkerhetsrisk.
med det här funktionssamtalet kan vi köra vårt kopieringskommando enligt följande:
import subprocess# Windowsstatus = subprocess.call('copy file1.txt file8.txt', shell=True)# Unixstatus = subprocess.call('cp file1.txt file8.txt', shell=True)
som exemplet ovan visar behöver vi helt enkelt skicka en sträng med skalkommandot, som tidigare.
och som förväntat kopierar operativsystemet ” file1.txt ”till en fil med namnet” fil8.txt”.
check_output Method
denna metod tillåter oss också att utföra ett kommando i ett skal. Det är väldigt mycket som kommandot subprocess.run
, förutom att det som standard rör data från stdout som kodade byte. Syntaxen är som följer:
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
härargs
parametern innehåller det skalkommando vi vill använda. Återigen varnar Python-dokumentationen oss om att använda shell=True
, så använd den här metoden med försiktighet.
i följande kod kopierar vi ” file1.txt ”till” fil9.TXT”med kommandot 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)
och som med alla kommandon som vi har visat i den här artikeln kopierar detta filen ”file1.txt” till destinationen vi angav, vilket är ” file9.txt ” här.
Wrapping Up
Python erbjuder oss många olika sätt att kopiera filer, varav några är en del av Python-uppsättningen metoder. Andra använder några av Pythons kraftfulla metoder för att utföra kommandon i ett skal, som använder skalkommandon som copy
eller cp
.
Inte säker på vilken som är rätt för dig? Vi presenterade många olika sätt att kopiera filer här, så det är förståeligt. Metoden du använder för att kopiera en fil är helt upp till dig och beror på dina specifika behov. Även om i de flesta fall en av kommandona shutil
fungerar bra för dig. Försök börja med shutil.copy2
och se om det gör vad du behöver.