Jak skopiować plik w Pythonie?

2474

Jak skopiować plik w Pythonie?

Nie mogłem znaleźć niczego pod os.

Matt
źródło
117
Wygląda na to, że cp nie jest wywołaniem systemowym i dlatego nie należy do modułu os. Jest to polecenie powłoki, dlatego zostało umieszczone w module shutil.
waldol1

Odpowiedzi:

3005

shutilma wiele metod, których możesz użyć. Jednym z nich jest:

from shutil import copyfile
copyfile(src, dst)
  • Skopiuj zawartość pliku o nazwie src do pliku o nazwie dst .
  • Lokalizacja docelowa musi być zapisywalna; w przeciwnym razie zostanie zgłoszony wyjątek IOError .
  • Jeśli dst już istnieje, zostanie zastąpione.
  • Za pomocą tej funkcji nie można kopiować plików specjalnych, takich jak urządzenia znakowe lub blokowe oraz potoki.
  • W przypadku copy , src i dst są nazwami ścieżek podanymi jako ciągi znaków .

Jeśli korzystasz z os.pathoperacji, użyj copyraczej niż copyfile. copyfilebędzie akceptować tylko ciągi .

Swati
źródło
147
Jaka jest różnica między kopiowaniem a plikiem kopiowania?
Matt
385
w copy (src, dst) dst może być katalogiem.
Owen
41
Pamiętaj, że nie wszystkie metadane zostaną skopiowane, w zależności od platformy.
Kevin Horn
12
Pamiętaj, że nie jest to operacja atomowa. Uważaj, używając go w aplikacji wątkowej.
waterbyte
4
Należy pamiętać, że nie może obsługiwać skrótów takich jak ~, ale może radzić sobie ze ścieżkami względnymi
zwep
1251
┌──────────────────┬────────┬───────────┬───────┬────────────────┐
│     Function     │ Copies │   Copies  │Can use│   Destination  │
│                  │metadata│permissions│buffer │may be directory│
├──────────────────┼────────┼───────────┼───────┼────────────────┤
│shutil.copy       │   No   │    Yes    │   No  │      Yes       │
│shutil.copyfile   │   No   │     No    │   No  │       No       │
│shutil.copy2      │  Yes   │    Yes    │   No  │      Yes       │
│shutil.copyfileobj│   No   │     No    │  Yes  │       No       │
└──────────────────┴────────┴───────────┴───────┴────────────────┘
jezrael
źródło
732

copy2(src,dst)jest często bardziej przydatny niż copyfile(src,dst)dlatego, że:

  • pozwala dstsię do katalogu (zamiast pełnej nazwy pliku docelowego), w którym to przypadku basename od srcsłuży do tworzenia nowego pliku;
  • zachowuje oryginalne informacje o modyfikacji i dostępie (mtime i atime) w metadanych pliku (jednak wiąże się to z niewielkim narzutem).

Oto krótki przykład:

import shutil
shutil.copy2('/src/dir/file.ext', '/dst/dir/newname.ext') # complete target filename given
shutil.copy2('/src/file.ext', '/dst/dir') # target filename is /dst/dir/file.ext
nieoprawny
źródło
19
Próbuję losowo skopiować 100 000 plików z 1 miliona plików. copyfilejest znacznie szybszy niżcopy2
Vijay
4
czy słusznie zakładam, że shutil.copy2('/dir/file.ext', '/new/dir/')(z ukośnikiem za ścieżką docelową) usunie dwuznaczność, czy skopiować do nowego pliku o nazwie „katalog”, czy umieścić plik w katalogu o tej nazwie?
Zak.
1
@Vijay Uważam, że narzut ten wynika z kopiowania metadanych.
Jonathan H
@Zak Nie ma dwuznaczności, jeśli /new/diristnieje katalog, patrz komentarz @ MatthewAlpert.
Jonathan H
@Zak Masz rację, dodanie ukośnika na końcu usuwa dwuznaczność. Jeśli /new/dir/nie istnieje, Python rzuci an IsADirectoryError, w przeciwnym razie kopiuje plik do /new/dir/oryginalnej nazwy.
martonbognar
125

Możesz użyć jednej z funkcji kopiowania z shutilpakietu:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Funkcja zachowuje obsługę obsługuje inne kopie
                      katalog uprawnień dest. plik obj metadane  
―――――――――――――――――――――――――――――――――――――――――――――――――― ――――――――――――――――――――――――――――
shutil.copy               ✔ ✔ ☐ ☐
 shutil.copy2              ✔ ✔ ☐ ✔
 shutil.copyfile           ☐ ☐ ☐ ☐
 shutil.copyfileobj        ☐ ☐ ✔ ☐
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Przykład:

import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')
maxschlepzig
źródło
10
Ciekawe, jak wygenerowałeś ten stół?
lightalchemist
16
@lightalchemist Właśnie użyłem vima jako scratchpada, skopiowałem używane symbole Unicode z tabeli wikipedii i skopiowałem wynik do edytora stackoverflow w celu ostatecznego polerowania.
maxschlepzig
3
Czym różni się to od innych odpowiedzi sprzed 2 lat? stackoverflow.com/a/30359308/674039
wim
1
@wim, musisz porównać moją odpowiedź z wersją 2017, którą podałeś, która była aktualna, kiedy opublikowałem moją odpowiedź. Główne różnice: moja odpowiedź wykorzystuje lepsze / bardziej opisowe nagłówki kolumn, układ tabeli nie rozprasza, zawiera bezpośrednie linki do dokumentacji i dodałem kolumnę (tzn. „Akceptuje plik obj”).
maxschlepzig
4
OK. YMMV, ale myślę, że zmiany kosmetyczne i takie drobne ulepszenia lepiej wprowadzać jako modyfikacje istniejących odpowiedzi, niż powielania odpowiedzi.
wim
104

W Pythonie możesz kopiować pliki za pomocą


import os
import shutil
import subprocess

1) Kopiowanie plików za pomocą shutilmodułu

shutil.copyfile podpis

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

# example    
shutil.copyfile('source.txt', 'destination.txt')

shutil.copy podpis

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

# example
shutil.copy('source.txt', 'destination.txt')

shutil.copy2 podpis

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

# example
shutil.copy2('source.txt', 'destination.txt')  

shutil.copyfileobj podpis

shutil.copyfileobj(src_file_object, dest_file_object[, length])

# example
file_src = 'source.txt'  
f_src = open(file_src, 'rb')

file_dest = 'destination.txt'  
f_dest = open(file_dest, 'wb')

shutil.copyfileobj(f_src, f_dest)  

2) Kopiowanie plików za pomocą osmodułu

os.popen podpis

os.popen(cmd[, mode[, bufsize]])

# example
# In Unix/Linux
os.popen('cp source.txt destination.txt') 

# In Windows
os.popen('copy source.txt destination.txt')

os.system podpis

os.system(command)


# In Linux/Unix
os.system('cp source.txt destination.txt')  

# In Windows
os.system('copy source.txt destination.txt')

3) Kopiowanie plików za pomocą subprocessmodułu

subprocess.call podpis

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

# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.call('cp source.txt destination.txt', shell=True) 

# In Windows
status = subprocess.call('copy source.txt destination.txt', shell=True)

subprocess.check_output podpis

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

# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.check_output('cp source.txt destination.txt', shell=True)

# In Windows
status = subprocess.check_output('copy source.txt destination.txt', shell=True)

kmario23
źródło
9
Używanie poleceń jednołańcuchowych jest złym stylem kodowania (elastyczność, niezawodność i bezpieczeństwo), zamiast tego używaj ['copy', sourcefile, destfile]składni tam, gdzie to możliwe, szczególnie jeśli parametry pochodzą z danych wprowadzonych przez użytkownika.
Marcel Waldvogel
8
Dlaczego wymieniasz tak wiele złych alternatyw dla funkcji kopiowania shutil?
maxschlepzig
6
Shutil jest wbudowany, nie ma potrzeby oferowania nieprzenośnych alternatyw. Odpowiedź można poprawić, usuwając rozwiązania zależne od systemu, a po usunięciu ta odpowiedź jest tylko kopią istniejących odpowiedzi / kopią dokumentacji.
Jean-François Fabre
3
os.popenjest przez pewien czas przestarzałe. i check_outputnie zwraca statusu, ale wyjście (które jest puste w przypadku copy/cp)
Jean-François Fabre
2
shutil nie kopiuje plików. U góry dokumentów znajduje się duże ostrzeżenie o tłuszczu . „oznacza to, że właściciel pliku i grupa zostaną utracone, a także listy ACL. W systemie Mac OS rozwidlenie zasobów i inne metadane nie są używane. Oznacza to, że zasoby zostaną utracone, a typy plików i kody twórców będą nieprawidłowe. W systemie Windows, właściciele plików, listy ACL i alternatywne strumienie danych nie są kopiowane. ”
gman
96

Kopiowanie pliku jest stosunkowo prostą operacją, jak pokazano w poniższych przykładach, ale zamiast tego powinieneś użyć do tego modułu shutil stdlib .

def copyfileobj_example(source, dest, buffer_size=1024*1024):
    """      
    Copy a file from source to dest. source and dest
    must be file-like objects, i.e. any object with a read or
    write method, like for example StringIO.
    """
    while True:
        copy_buffer = source.read(buffer_size)
        if not copy_buffer:
            break
        dest.write(copy_buffer)

Jeśli chcesz skopiować według nazwy pliku, możesz zrobić coś takiego:

def copyfile_example(source, dest):
    # Beware, this example does not handle any edge cases!
    with open(source, 'rb') as src, open(dest, 'wb') as dst:
        copyfileobj_example(src, dst)
Liczba Pi.
źródło
25
Jakiś czas temu zauważyłem, że moduł nazywa się shutil (liczba pojedyncza), a nie shutils (liczba mnoga), i rzeczywiście jest w Pythonie 2.3. Niemniej jednak zostawiam tę funkcję tutaj jako przykład.
pi.
4
Kopiowanie zawartości pliku jest prostą operacją. Kopiowanie pliku z jego metadanymi nie jest proste, tym bardziej, jeśli chcesz być wieloplatformowy.
LaC
3
Prawdziwe. Patrząc na dokumenty shutil, funkcja copyfile również nie kopiuje metadanych.
pi.
3
Tak, nie jestem pewien, dlaczego po prostu nie skopiujesz źródła shutil.copyfileobj. Ponadto nie musisz try, finallyzajmować się zamykaniem plików po wyjątkach. Powiedziałbym jednak, że twoja funkcja nie powinna w ogóle odpowiadać za otwieranie i zamykanie plików. Powinno to przebiegać w funkcji otoki, np. Jak shutil.copyfileotacza shutil.copyfileobj.
ErlVolton
2
Powyższy kod powinien określać, że destma być zapisywalny:open(dest, 'wb')
użytkownik1016274
69

Użyj modułu Shutil .

copyfile(src, dst)

Skopiuj zawartość pliku o nazwie src do pliku o nazwie dst. Lokalizacja docelowa musi być zapisywalna; w przeciwnym razie zostanie zgłoszony wyjątek IOError. Jeśli dst już istnieje, zostanie zastąpione. Za pomocą tej funkcji nie można kopiować plików specjalnych, takich jak urządzenia znakowe lub blokowe oraz potoki. src i dst to nazwy ścieżek podane jako ciągi znaków.

Spójrz na system plików dla wszystkich funkcji obsługi plików i katalogów dostępnych w standardowych modułach Python.

Airsource Ltd
źródło
shutil nie kopiuje plików. U góry dokumentów znajduje się duże ostrzeżenie o tłuszczu . „oznacza to, że właściciel pliku i grupa zostaną utracone, a także listy ACL. W systemie Mac OS rozwidlenie zasobów i inne metadane nie są używane. Oznacza to, że zasoby zostaną utracone, a typy plików i kody twórców będą nieprawidłowe. W systemie Windows, właściciele plików, listy ACL i alternatywne strumienie danych nie są kopiowane. ”
gman
47

Przykład skopiowania katalogu i pliku - z Tima Golden'a w Pythonie:

http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html

import os
import shutil
import tempfile

filename1 = tempfile.mktemp (".txt")
open (filename1, "w").close ()
filename2 = filename1 + ".copy"
print filename1, "=>", filename2

shutil.copy (filename1, filename2)

if os.path.isfile (filename2): print "Success"

dirname1 = tempfile.mktemp (".dir")
os.mkdir (dirname1)
dirname2 = dirname1 + ".copy"
print dirname1, "=>", dirname2

shutil.copytree (dirname1, dirname2)

if os.path.isdir (dirname2): print "Success"
Noam Manos
źródło
24

Po pierwsze, stworzyłem wyczerpujący zestaw metod shutil dla twojego odniesienia.

shutil_methods =
{'copy':['shutil.copyfileobj',
          'shutil.copyfile',
          'shutil.copymode',
          'shutil.copystat',
          'shutil.copy',
          'shutil.copy2',
          'shutil.copytree',],
 'move':['shutil.rmtree',
         'shutil.move',],
 'exception': ['exception shutil.SameFileError',
                 'exception shutil.Error'],
 'others':['shutil.disk_usage',
             'shutil.chown',
             'shutil.which',
             'shutil.ignore_patterns',]
}

Po drugie, wyjaśnij metody kopiowania w przykładach:

  1. shutil.copyfileobj(fsrc, fdst[, length]) manipulować otwartymi obiektami
In [3]: src = '~/Documents/Head+First+SQL.pdf'
In [4]: dst = '~/desktop'
In [5]: shutil.copyfileobj(src, dst)
AttributeError: 'str' object has no attribute 'read'
#copy the file object
In [7]: with open(src, 'rb') as f1,open(os.path.join(dst,'test.pdf'), 'wb') as f2:
    ...:      shutil.copyfileobj(f1, f2)
In [8]: os.stat(os.path.join(dst,'test.pdf'))
Out[8]: os.stat_result(st_mode=33188, st_ino=8598319475, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067347, st_mtime=1516067335, st_ctime=1516067345)
  1. shutil.copyfile(src, dst, *, follow_symlinks=True) Skopiuj i zmień nazwę
In [9]: shutil.copyfile(src, dst)
IsADirectoryError: [Errno 21] Is a directory: ~/desktop'
#so dst should be a filename instead of a directory name
  1. shutil.copy() Kopiuj bez uprzedniego wyświetlania metadanych
In [10]: shutil.copy(src, dst)
Out[10]: ~/desktop/Head+First+SQL.pdf'
#check their metadata
In [25]: os.stat(src)
Out[25]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066425, st_mtime=1493698739, st_ctime=1514871215)
In [26]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[26]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066427, st_mtime=1516066425, st_ctime=1516066425)
# st_atime,st_mtime,st_ctime changed
  1. shutil.copy2() Kopiuj z zachowaniem metadanych
In [30]: shutil.copy2(src, dst)
Out[30]: ~/desktop/Head+First+SQL.pdf'
In [31]: os.stat(src)
Out[31]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067055, st_mtime=1493698739, st_ctime=1514871215)
In [32]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[32]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067063, st_mtime=1493698739, st_ctime=1516067055)
# Preseved st_mtime
  1. shutil.copytree()

Rekurencyjnie skopiuj całe drzewo katalogów zrootowane na src, zwracając katalog docelowy

Rachunek różniczkowy
źródło
1
shutil nie kopiuje plików. U góry dokumentów znajduje się duże ostrzeżenie o tłuszczu . „oznacza to, że właściciel pliku i grupa zostaną utracone, a także listy ACL. W systemie Mac OS rozwidlenie zasobów i inne metadane nie są używane. Oznacza to, że zasoby zostaną utracone, a typy plików i kody twórców będą nieprawidłowe. W systemie Windows, właściciele plików, listy ACL i alternatywne strumienie danych nie są kopiowane. ”
gman
19

W przypadku małych plików i korzystania tylko z wbudowanych Pythona można użyć następującego jednowierszowego:

with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())

Jak wspomniano w komentarzach @maxschlepzig, nie jest to optymalny sposób dla aplikacji, w których plik jest zbyt duży lub gdy pamięć jest krytyczna, dlatego należy preferować odpowiedź Swati .

żółty 01
źródło
3
Odczytuje pełny plik źródłowy do pamięci przed jego ponownym zapisaniem. W ten sposób niepotrzebnie marnuje się pamięć na wszystkie operacje kopiowania plików oprócz najmniejszych.
maxschlepzig
1
Czy to prawda? Myślę, że .read()i .write()są buforowane domyślnie (przynajmniej dla CPython).
soundstripe
@soundstripe, Oczywiście to prawda. Fakt, że obiekt pliku zwracany przez open()buforuje IO, domyślnie nie pomaga tutaj, ponieważ read()jest określony jako: „Jeśli n jest ujemne lub pominięte, czytaj do EOF”. Oznacza to, że read()zwraca całą zawartość pliku jako ciąg.
maxschlepzig
@maxschlepzig Rozumiem twój punkt widzenia i przyznaję, że nie byłem tego świadomy. Podałem tę odpowiedź na wypadek, gdyby ktoś chciał zrobić prostą kopię pliku przy użyciu tylko wbudowanych elementów, bez potrzeby importowania modułu. Oczywiście optymalizacja pamięci nie powinna być problemem, jeśli chcesz tę opcję. W każdym razie dziękuję za wyjaśnienie tego. Odpowiednio zaktualizowałem odpowiedź.
yellow01
14

Możesz użyć os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')

lub jak to zrobiłem

os.system('cp '+ rawfile + ' rawdata.dat')

gdzie rawfilejest nazwa, którą wygenerowałem w programie.

Jest to rozwiązanie tylko dla systemu Linux

znak
źródło
10
nie jest to przenośne i niepotrzebne, ponieważ można po prostu użyć shutil.
Corey Goldberg,
4
Nawet gdy shutilnie jest dostępny - subprocess.run() (bez shell=True!) Jest lepszą alternatywą dla os.system().
maxschlepzig
1
Shutil jest bardziej przenośny
Hiadore,
1
subprocess.run()jak sugeruje @maxschlepzig, to duży krok naprzód w przypadku wywoływania programów zewnętrznych. Jednak w celu zapewnienia elastyczności i bezpieczeństwa użyj ['cp', rawfile, 'rawdata.dat']formularza przekazania wiersza polecenia. (Jednak w przypadku kopiowania shutilzaleca się , aby znajomi zamiast wywoływać program zewnętrzny).
Marcel Waldvogel,
2
spróbuj tego z nazwami plików ze spacjami.
Jean-François Fabre
11

W przypadku dużych plików zrobiłem to, czytając plik linia po linii i czytając każdą linię w tablicy. Następnie, gdy tablica osiągnie określony rozmiar, dołącz ją do nowego pliku.

for line in open("file.txt", "r"):
    list.append(line)
    if len(list) == 1000000: 
        output.writelines(list)
        del list[:]
ytpillai
źródło
2
wydaje się to trochę zbędne, ponieważ pisarz powinien obsługiwać buforowanie. for l in open('file.txt','r'): output.write(l)powinien znaleźć pracę; po prostu skonfiguruj bufor strumienia wyjściowego do swoich potrzeb. lub możesz przejść przez bajty, zapętlając próbę, output.write(read(n)); output.flush()gdzie njest liczba bajtów, którą chcesz zapisać na raz. oba z nich również nie mają warunku, aby sprawdzić, która premia.
jest właścicielem
1
Tak, ale pomyślałem, że może to być łatwiejsze do zrozumienia, ponieważ kopiuje całe wiersze, a nie ich części (na wypadek, gdybyśmy nie wiedzieli, ile bajtów to każda linia).
ytpillai
Bardzo prawdziwe. Kodowanie do nauczania i kodowanie dla wydajności są bardzo różne.
posiada
1
patrząc na źródło - piszą rozmowy writelines, hg.python.org/cpython/file/c6880edaf6f3/Modules/_io/bytesio.c . Strumień plików jest już otwarty, więc zapis nie musiałby go otwierać za każdym razem.
posiada
2
To okropne. Wykonuje niepotrzebną pracę bez uzasadnionego powodu. Nie działa w przypadku dowolnych plików. Kopia nie jest identyczna bajtowo, jeśli dane wejściowe mają nietypowe zakończenia linii w systemach takich jak Windows. Jak myślisz, dlaczego może to być łatwiejsze do zrozumienia niż wywołanie funkcji kopiowania wshutil ? Nawet przy ignorowaniu shutilprosta blokowa pętla odczytu / zapisu (wykorzystująca niebuforowane We / Wy) jest prosta, byłaby wydajna i miałaby znacznie większy sens niż to, a zatem z pewnością jest łatwiejsza do nauczenia i zrozumienia.
maxschlepzig
11
from subprocess import call
call("cp -p <file> <file>", shell=True)
głębokie nurkowanie
źródło
10
To zależy od platformy, więc nie używałbym.
Kevin Meier,
5
Takie calljest niepewne. Proszę odnieść się do tego podproces docu na ten temat.
buhtz
2
nie jest to przenośne i niepotrzebne, ponieważ można po prostu użyć shutil.
Corey Goldberg,
2
Hmm, dlaczego więc Python?
Baris Demiray,
Może wykryje system operacyjny przed uruchomieniem (czy to DOS, czy Unix, ponieważ są to dwa najczęściej używane)
MilkyWay90
8

Począwszy od języka Python 3.5 , możesz wykonywać następujące czynności w przypadku małych plików (tj. Plików tekstowych, małych plików JPEG):

from pathlib import Path

source = Path('../path/to/my/file.txt')
destination = Path('../path/where/i/want/to/store/it.txt')
destination.write_bytes(source.read_bytes())

write_bytes nadpisze wszystko, co było w miejscu docelowym

Marc
źródło
2
A potem ktoś używa kodu (przypadkowo lub celowo) na dużym pliku… Korzystanie z funkcji z shutilobsługi wszystkich specjalnych przypadków dla ciebie i daje ci spokój.
Marcel Waldvogel
4
przynajmniej nie powtarza tych samych rozwiązań w kółko.
Jean-François Fabre
6
open(destination, 'wb').write(open(source, 'rb').read())

Otwórz plik źródłowy w trybie odczytu i zapisz do pliku docelowego w trybie zapisu.

S471
źródło
1
Pomysł jest fajny, a kod jest piękny, ale odpowiednia funkcja copy () może robić więcej rzeczy, takich jak kopiowanie atrybutów (bit + x) lub na przykład usuwanie już skopiowanych bajtów w przypadku znalezienia stanu pełnego dysku .
Raúl Salinas-Monteagudo
1
Wszystkie odpowiedzi wymagają wyjaśnienia, nawet jeśli jest to jedno zdanie. Żadne wyjaśnienie nie stanowi złego precedensu i nie jest pomocne w zrozumieniu programu. Co się stanie, jeśli pojawi się pełny Python Noob i zobaczy to, będzie chciał go użyć, ale nie może, ponieważ go nie rozumie? Chcesz być pomocny dla wszystkich w swoich odpowiedziach.
connectyourcharger
1
Czy nie brakuje tych .close()wszystkich open(...)?
luckydonald
Nie ma potrzeby .close (), ponieważ NIGDY NIE PRZECHOWYWAMY obiektu wskaźnika pliku (ani dla pliku src, ani dla pliku docelowego).
S471,
1
Takie samo nieoptymalne marnowanie pamięci, jak odpowiedź yellow01 .
maxschlepzig
-3

Python zapewnia wbudowane funkcje do łatwego kopiowania plików za pomocą narzędzi powłoki systemu operacyjnego.

Poniższe polecenie służy do kopiowania pliku

shutil.copy(src,dst)

Poniższe polecenie służy do kopiowania pliku z informacjami MetaData

shutil.copystat(src,dst)
Savai Maheshwari
źródło
copyNastępnie należy uruchomić, copystataby zachować metadane pliku. W Python 3.3+ copystatkopiuje także rozszerzone atrybuty.
ingyhere