Cum să copiați un fișier în Python

Introducere

când vine vorba de utilizarea Python pentru a copia fișiere, există două moduri principale: utilizarea modululuishutil sau a modululuios. Toate metodeleos pe care le prezentăm aici sunt metode care ne permit să executăm comenzi shell din Codul nostru Python, pe care le vom folosi pentru a executa comandacopy (Windows) sau comandacp (Unix).

veți observa că multe dintre aceste metode, atât în modululshutil, cât și în modululos, au funcționalități foarte similare (ceea ce nu ar trebui să fie surprinzător), dar fiecare variază foarte ușor în funcționalitate, ceea ce voi explica și eu.

copierea fișierelor cu modulul shutil

modulul shutil oferă mai multe metode de nivel înalt pentru copierea fișierelor. Iată mai jos Principalele:

copyfile

această metodă copiază conținutul unui fișier într-un alt fișier. Destinația furnizată acestuia trebuie să fie un fișier care poate fi scris și să aibă un nume diferit de fișierul sursă. Dacă numele sunt aceleași, atunci va genera o eroare. Dacă fișierul destinație există deja, acesta va fi înlocuit cu fișierul nou copiat.

sintaxa pentru această metodă este:

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

de exemplu, următorul cod va copia un fișier numit „file1.txt ” într-un fișier numit „file2.txt”:

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

o caracteristică interesantă și potențial utilă a shutil.copyfile este follow_symlinks argumentul Boolean. Dacă este setat la False, iar fișierul sursă este o legătură simbolică, atunci în loc să copiați fișierul, va fi creată o nouă legătură simbolică.

copy

această metodă este foarte asemănătoare cucopyfile, principala diferență fiind că, pe lângă copierea conținutului fișierului sursă, merge cu un pas mai departe și copiază și permisiunile sistemului de fișiere ale fișierului. Copierea permisiunilor de fișiere nu este o sarcină banală în majoritatea limbajelor de programare, deci aceasta este o caracteristică plăcută.

sintaxa este după cum urmează:

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

fiecare dintre acești parametri sunt aceiași ca în metodacopyfile. De exemplu, următorul cod va copia „fișier1.txt „în” fișier3.txt”.

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

Notă: Asigurați-vă că nu denumiți scriptul dvs. la fel ca unul dintre modulele pe care le importați (ceea ce am făcut din greșeală când am testat codul pentru acest articol). Dacă faceți acest lucru, atunci veți primi o eroare atunci când încercați să importați acel modul din cauza unei probleme de import circular.

copy2

ca și în cazul metodelor anterioare, metodacopy2 este identică cu metodacopy, dar pe lângă copierea conținutului fișierului încearcă să păstreze toate metadatele fișierului sursă. Dacă platforma nu permite salvarea completă a metadatelor, atunci copy2 nu returnează eșecul și va păstra orice metadate poate.

sintaxa este următoarea:

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

Din nou, acești parametri sunt aceiași ca în comenzile anterioare pe care le-am menționat până acum.

de exemplu, următorul cod va copia „file1.txt „în” fișier4.txt”, precum și păstrarea metadatelor fișierului original, ” 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

după cum putem vedea din executarea codului nostru de mai sus, „file1.txt „a fost copiat în” file4.txt”. Cu toate acestea, este posibil să fi observat că data creării a fost păstrată în noul fișier, spre deosebire de shutil.copy, care a copiat „file1.txt ” la ” fișier3.txt ” și i-a dat o nouă dată de creare.

copyfileobj

această metodă copiază conținutul unui fișier sursă într-un fișier destinație, din poziția curentă a fișierului sursă. Aceasta înseamnă că dacă citiți date din obiectul fișierului sursă, atunci poziția la care opriți citirea este poziția copyfileobj începe să copieze.

sintaxa este următoarea:

shutil.copyfileobj(src_file_object, dest_file_object)

semnificațiile parametrilor fișierului sursă și destinație sunt similare cu comenzile anterioare, dar acum se referă la obiecte. Parametrul lungime este opțional și reprezintă dimensiunea tamponului care este numărul de mușcături păstrate în memorie în timpul procesului de copiere. Această opțiune poate fi utilă atunci când copiați fișiere foarte mari, deoarece poate accelera procesul de copiere și evită utilizarea necontrolată a memoriei.

de exemplu, următorul cod va copia „file1.txt „în” fișier5.txt”

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

după cum putem vedea, pentru a utilizacopyfileobj, trebuie să deschidem fișierele în modul binar (care este partea” b „a” rb „și”wb”). În plus, fișierul sursă trebuie deschis ca lizibil, iar fișierul de destinație trebuie deschis ca scris (părțile „R” și, respectiv, „w”).

copierea fișierelor cu modulul os

modulul os oferă o modalitate de a utiliza funcționalitatea sistemului de operare pentru a copia fișierele. În cele mai multe (dacă nu toate) dintre exemplele de aici încolo oferim exemple care funcționează atât pentru Windows, cât și pentru Unix. Exemplele sunt diferite din cauza comenzilor shell utilizate, deci asigurați-vă că acordați atenție modului în care fiecare apel de funcție este etichetat în comentariile Python.

popen

această metodă deschide o conductă către sau de la comanda dvs. Cu toate acestea, rețineți că această metodă a fost depreciată în Python 2.6, deci nu vă recomandăm să o utilizați decât dacă trebuie. Ca alternativă, documentația Python ne sfătuiește să folosim în schimb metode din modulul subproces.

sintaxa este după cum urmează:

os.popen(cmd])

aici valoarea returnată este un obiect fișier care este conectat la conducta. Acest obiect poate fi citit sau scris în funcție de modul. Modul implicit este ‘r’, care permite citirea conținutului fișierului.

exemplul de mai jos va copia fișierul „1.txt „în” fișier6.txt”:

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

rularea comenzii în acest fel este exact aceeași ca și cum ați fi rulat-o direct din linia de comandă a terminalului.

sistem

această metodă execută comanda specificată într-un subshell. Este disponibil atât pentru Unix, cât și pentru Windows. Sintaxa este următoarea:

os.system(command)

aicicommand este un șir care conține comanda shell DOS sau UNIX. În cazul nostru, Aici vom pune comandacopy saucp.

de exemplu, următorul cod va copia „file1.txt „în” fișier7.txt”

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

aceasta arată identic cu comanda anterioarăos.popen pe care tocmai am folosit-o, dar comanda este executată într-un subshell, ceea ce înseamnă că este executată într-un fir separat în paralel cu codul dvs. de executare. Pentru a aștepta finalizarea acestuia, trebuie să apelați .wait() pe obiectul returnat de os.system.

copierea fișierelor cu modulul subproces

modulul subproces intenționează să înlocuiască unele metode înos (în specialos.system șios.spawn* metode), și prezintă două metode principale pentru a accesa comenzile sistemului de operare. Aceste metode sunt call și check_output. Încă o dată, pentru sistemele Unix, comanda „copiați fișierul1.fișier txt2.txt ” ar trebui înlocuit cu „fișier CP1.fișier txt2.txt”.

metoda de apel

documentația Python ne recomandă să folosim metodacall pentru a lansa o comandă din sistemul de operare.

sintaxa este următoarea:

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

parametrulargs va include comanda noastră shell. Cu toate acestea, un cuvânt de precauție, deoarece documentația Python ne avertizează că utilizarea shell=True poate fi un risc de securitate.

folosind acest apel de funcții, putem rula comanda noastră de copiere după cum urmează:

import subprocess# Windowsstatus = subprocess.call('copy file1.txt file8.txt', shell=True)# Unixstatus = subprocess.call('cp file1.txt file8.txt', shell=True)

după cum arată exemplul de mai sus, trebuie doar să trecem un șir cu comanda shell, ca înainte.

și cum era de așteptat, sistemul de operare va copia „file1.txt ” într-un fișier numit „file8.txt”.

metoda check_output

această metodă ne permite, de asemenea, să executăm o comandă într-un shell. Seamănă foarte mult cu comandasubprocess.run, cu excepția faptului că, în mod implicit, transferă date de la stdout ca octeți codificați. Sintaxa este după cum urmează:

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

aici parametrulargs include comanda shell pe care dorim să o folosim. Încă o dată, documentația Python ne avertizează să folosim shell=True, deci folosiți această metodă cu precauție.

în următorul cod vom copia „file1.txt ” la ” fișier9.txt ” folosindcheck_output comanda:

import subprocess# Windowsstatus = subprocess.check_output('copy file1.txt file9.txt', shell=True)# Unixstatus = subprocess.check_output('cp file1.txt file9.txt', shell=True)

și ca și în cazul tuturor comenzilor pe care le-am arătat în acest articol, aceasta va copia fișierul „file1.txt ” la destinația pe care am specificat-o, care este „file9.txt ” aici.

împachetarea

Python ne oferă multe moduri diferite de a copia fișiere, dintre care unele fac parte din setul de metode Python. Alții folosesc unele dintre metodele puternice ale Python pentru a executa comenzi într-un shell, care utilizează comenzi shell precum copy sau cp.

nu sunt sigur care unul este potrivit pentru tine? Am prezentat o mulțime de moduri diferite de a copia fișiere aici, deci este de înțeles. Metoda pe care o utilizați pentru a copia un fișier depinde complet de dvs. și va depinde de nevoile dvs. specifice. Deși în majoritatea cazurilor una dintre comenzile shutil va funcționa foarte bine pentru dvs. Încercați să începeți cu shutil.copy2 și vedeți dacă asta face ceea ce aveți nevoie.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *