Jak skopiować plik w Pythonie

wprowadzenie

jeśli chodzi o używanie Pythona do kopiowania plików, istnieją dwa główne sposoby: użycie modułushutil lub modułuos. Wszystkie metodyos pokazane tutaj są metodami, które pozwalają nam na wykonywanie poleceń powłoki z naszego kodu Pythona, których użyjemy do wykonania poleceniacopy (Windows) lub poleceniacp (Unix).

zauważysz, że wiele z tych metod, zarówno w moduleshutil, jak i moduleos, ma bardzo podobną funkcjonalność (co nie powinno dziwić), ale każda z nich różni się od siebie bardzo nieznacznie, co również wyjaśnię.

kopiowanie plików za pomocą modułu shutil

moduł shutil oferuje kilka metod wysokiego poziomu kopiowania plików. Poniżej znajdują się najważniejsze z nich:

copyfile

ta metoda kopiuje zawartość jednego pliku do innego. Adres docelowy musi być zapisywalnym plikiem i mieć inną nazwę niż plik źródłowy. Jeśli nazwy są takie same, wygeneruje błąd. Jeśli plik docelowy już istnieje, zostanie zastąpiony nowo skopiowanym plikiem.

składnia tej metody jest następująca:

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

na przykład poniższy kod skopiuje plik o nazwie „file1.txt „do pliku o nazwie” plik2.txt”:

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

jedną z interesujących i potencjalnie przydatnych funkcji shutil.copyfile jest follow_symlinks argument logiczny. Jeśli jest ustawiony na False, a plik źródłowy jest dowiązaniem symbolicznym, to zamiast kopiować plik, zostanie utworzone nowe dowiązanie symboliczne.

Kopiuj

ta metoda jest bardzo podobna do copyfile, z główną różnicą, że oprócz kopiowania zawartości pliku źródłowego, idzie o krok dalej, a także kopiuje Uprawnienia systemu plików. Kopiowanie uprawnień do plików nie jest trywialnym zadaniem w większości języków programowania, więc jest to miła funkcja.

składnia wygląda następująco:

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

każdy z tych parametrów jest taki sam jak w metodziecopyfile. Na przykład poniższy kod skopiuje „file1.txt „into” file3.txt”.

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

Uwaga: Upewnij się, że nie nazwałeś swojego skryptu tak samo, jak jeden z importowanych modułów (co omyłkowo zrobiłem podczas testowania kodu dla tego artykułu). Jeśli to zrobisz, pojawi się błąd podczas próby zaimportowania tego modułu z powodu problemu z importem kołowym.

copy2

podobnie jak w przypadku poprzednich metod,copy2 metoda jest identyczna zcopy metoda, ale oprócz kopiowania zawartości pliku stara się również zachować wszystkie metadane pliku źródłowego. Jeśli platforma nie pozwala na pełne zapisywanie metadanych, to copy2 nie zwraca błędu i po prostu zachowuje wszelkie metadane, które może.

składnia wygląda następująco:

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

ponownie parametry te są takie same jak w poprzednich poleceniach, o których wspominaliśmy do tej pory.

na przykład poniższy kod skopiuje „file1.txt „into” file4.txt”, a także zachować metadane oryginalnego pliku, ” 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

jak widać po wykonaniu naszego kodu powyżej, „file1.txt „został skopiowany do” file4.txt”. Jednak być może zauważyłeś, że Data utworzenia została zachowana w Nowym pliku, w przeciwieństwie do shutil.copy, który skopiował „plik1.txt ” to ” file3.txt ” i nadała mu nową datę utworzenia.

copyfileobj

ta metoda kopiuje zawartość pliku źródłowego do pliku docelowego z bieżącej pozycji pliku źródłowego. Oznacza to, że jeśli odczytujesz dane z obiektu pliku źródłowego, to pozycja, na której zatrzymujesz czytanie, to pozycja copyfileobj rozpoczyna kopiowanie.

składnia wygląda następująco:

shutil.copyfileobj(src_file_object, dest_file_object)

znaczenie parametrów pliku źródłowego i docelowego jest podobne do poprzednich poleceń, ale teraz odnoszą się do obiektów. Parametr length jest opcjonalny i reprezentuje rozmiar bufora, który jest liczbą bitów przechowywanych w pamięci podczas procesu kopiowania. Ta opcja może być przydatna przy kopiowaniu bardzo dużych plików, ponieważ może przyspieszyć proces kopiowania i uniknąć niekontrolowanego użycia pamięci.

na przykład poniższy kod skopiuje „file1.txt „into” file5.txt”

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

jak widać, aby użyćcopyfileobj, musimy otworzyć pliki w trybie binarnym (który jest częścią „b” „rb” i „wb”). Ponadto plik źródłowy musi być otwarty jako czytelny, a plik docelowy jako zapisywalny (odpowiednio części” r „i” w”).

kopiowanie plików za pomocą modułu systemu operacyjnego

moduł systemu operacyjnego umożliwia wykorzystanie funkcji systemu operacyjnego do kopiowania plików. W większości (jeśli nie wszystkich) przykładów od teraz podajemy przykłady, które działają zarówno dla Windows, jak i Unix. Przykłady są różne ze względu na użyte polecenia powłoki, więc pamiętaj, aby zwrócić uwagę na to, jak każde wywołanie funkcji jest oznaczone w komentarzach Pythona.

popen

ta metoda otwiera Potok do lub z polecenia. Zauważ jednak, że ta metoda była przestarzała w Pythonie 2.6, więc nie zalecamy jej używania, chyba że musisz. Jako alternatywę, dokumentacja Pythona zaleca nam użycie metod z modułu podprocesowego.

składnia wygląda następująco:

os.popen(cmd])

tutaj zwracana wartość jest obiektem pliku, który jest podłączony do potoku. Obiekt ten można odczytywać lub zapisywać w zależności od trybu. Domyślnym trybem jest’ r’, który umożliwia odczyt zawartości pliku.

poniższy przykład skopiuje „file1.txt „into” file6.txt”:

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

Uruchomienie polecenia w ten sposób jest dokładnie takie samo, jak uruchomienie go bezpośrednio z wiersza poleceń terminala.

system

ta metoda wykonuje podane polecenie w podpowiedzi. Jest dostępny zarówno dla systemów Unix, jak i Windows. Składnia jest następująca:

os.system(command)

tutajcommand jest ciągiem zawierającym polecenie powłoki DOS lub Unix. W naszym przypadku w tym miejscu umieścimy polecenie copy lub cp.

na przykład poniższy kod skopiuje „file1.txt „into” file7.txt”

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

wygląda to identycznie jak poprzednieos.popen polecenie, którego właśnie użyliśmy, ale polecenie jest wykonywane w podpowłoce, co oznacza, że jest wykonywane w osobnym wątku równolegle do kodu wykonującego. Aby czekać na jego zakończenie, należy wywołać .wait() na obiekcie zwróconym przez os.system.

kopiowanie plików za pomocą modułu podprocesowego

moduł podprocesowy zamierza zastąpić niektóre metody w module os(w szczególności os.systemI os.spawn*) I prezentuje dwie główne metody dostępu do poleceń systemu operacyjnego. Te metody to call I check_output. Po raz kolejny, dla systemów uniksowych, polecenie ” Kopiuj plik1.plik txt2.txt ” należy zastąpić „CP file1.plik txt2.txt”.

call Method

dokumentacja Pythona zaleca nam użyciecall metody do uruchomienia polecenia z systemu operacyjnego.

składnia wygląda następująco:

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

parametrargs będzie zawierał nasze polecenie powłoki. Należy jednak zachować ostrożność, ponieważ dokumentacja Pythona ostrzega nas, że używanie shell=True może stanowić zagrożenie bezpieczeństwa.

używając tego wywołania funkcji, możemy uruchomić naszą komendę copy w następujący sposób:

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

Jak pokazuje powyższy przykład, po prostu musimy przekazać łańcuch z poleceniem powłoki, jak wcześniej.

i zgodnie z oczekiwaniami, system operacyjny skopiuje „plik1.txt „do pliku o nazwie” file8.txt”.

check_output metoda

ta metoda pozwala nam również wykonać polecenie wewnątrz powłoki. Jest to bardzo podobne do polecenia subprocess.run, z tą różnicą, że domyślnie wyprowadza dane ze standardowego wyjścia jako zakodowane bajty. Składnia jest następująca:

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

tutaj parametrargs zawiera polecenie powłoki, którego chcemy użyć. Po raz kolejny dokumentacja Pythona ostrzega nas przed użyciem shell=True, więc używaj tej metody ostrożnie.

w poniższym kodzie skopiujemy „file1.txt ” to ” file9.txt ” używając poleceniacheck_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)

i tak jak w przypadku wszystkich poleceń, które pokazaliśmy w tym artykule, skopiuje to plik „file1.txt „do wskazanego przez nas miejsca docelowego, czyli” file9.txt ” tutaj.

Python oferuje nam wiele różnych sposobów kopiowania plików, niektóre z nich są częścią zestawu metod Pythona. Inne używają potężnych metod Pythona do wykonywania poleceń w powłoce, które wykorzystują polecenia powłoki, takie jakcopy lubcp.

nie wiesz, który jest dla Ciebie odpowiedni? Przedstawiliśmy tutaj wiele różnych sposobów kopiowania plików, więc jest to zrozumiałe. Metoda, której używasz do kopiowania pliku, zależy wyłącznie od Ciebie i zależy od twoich konkretnych potrzeb. Chociaż w większości przypadków jedno z poleceńshutil będzie działać dobrze dla ciebie. Spróbuj zacząć od shutil.copy2 I zobacz, czy to robi to, czego potrzebujesz.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *