파이썬에는 파일 복사 기능 (예 shutil.copy
:)과 디렉터리 복사 기능 (예 :)이있는 것 같지만 shutil.copytree
둘 다 처리하는 기능을 찾지 못했습니다. 물론 파일이나 디렉토리를 복사할지 여부를 확인하는 것은 사소한 일이지만 이상한 누락처럼 보입니다.
실제로 unix cp -r
명령 처럼 작동하는 표준 기능이 없습니까? 즉, 디렉토리와 파일을 모두 지원하고 재귀 적으로 복사합니다. 파이썬에서이 문제를 해결하는 가장 우아한 방법은 무엇입니까?
답변
먼저을 호출 shutil.copytree
하고 예외가 발생하면를 사용하여 다시 시도하십시오 shutil.copy
.
import shutil, errno
def copyanything(src, dst):
try:
shutil.copytree(src, dst)
except OSError as exc: # python >2.5
if exc.errno == errno.ENOTDIR:
shutil.copy(src, dst)
else: raise
답변
Tzot 및 gns 답변 을 추가하려면 파일과 폴더를 재귀 적으로 복사하는 다른 방법이 있습니다. (Python 3.X)
import os, shutil
root_src_dir = r'C:\MyMusic' #Path/Location of the source directory
root_dst_dir = 'D:MusicBackUp' #Path to the destination folder
for src_dir, dirs, files in os.walk(root_src_dir):
dst_dir = src_dir.replace(root_src_dir, root_dst_dir, 1)
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
for file_ in files:
src_file = os.path.join(src_dir, file_)
dst_file = os.path.join(dst_dir, file_)
if os.path.exists(dst_file):
os.remove(dst_file)
shutil.copy(src_file, dst_dir)
처음이고 파일과 폴더를 재귀 적으로 복사하는 방법을 모른다면 도움이 되었기를 바랍니다.
답변
shutil.copy
및 shutil.copy2
파일을 복사합니다.
shutil.copytree
모든 파일과 모든 하위 폴더가있는 폴더를 복사합니다. 파일을 복사하는 데 shutil.copytree
사용 shutil.copy2
하고 있습니다.
아날로그 그래서 cp -r
당신이 말하는 인 shutil.copytree
때문에 cp -r
대상 복사 폴더와 파일 / 하위 폴더 좋아 shutil.copytree
. -r
cp
복사 파일 없이는 좋아 shutil.copy
하고 shutil.copy2
합니다.
답변
Unix cp
는 ‘디렉토리와 파일을 모두 지원’하지 않습니다.
betelgeuse:tmp james$ cp source/ dest/
cp: source/ is a directory (not copied).
cp가 디렉토리를 복사하도록하려면 ‘-r’플래그를 사용하여 cp에게 디렉토리임을 수동으로 알려야합니다.
하지만 여기에 약간의 연결이 끊어졌습니다 cp -r
. 소스가 파일 이름을 전달하면 행복하게 단일 파일 만 복사합니다. 카피 트리는 그렇지 않습니다.
답변
나는 copy_tree가 당신이 찾고있는 것이라고 생각합니다.
답변
파이썬 shutil.copytree 메소드는 엉망입니다. 올바르게 작동하는 작업을 수행했습니다.
def copydirectorykut(src, dst):
os.chdir(dst)
list=os.listdir(src)
nom= src+'.txt'
fitx= open(nom, 'w')
for item in list:
fitx.write("%s\n" % item)
fitx.close()
f = open(nom,'r')
for line in f.readlines():
if "." in line:
shutil.copy(src+'/'+line[:-1],dst+'/'+line[:-1])
else:
if not os.path.exists(dst+'/'+line[:-1]):
os.makedirs(dst+'/'+line[:-1])
copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
f.close()
os.remove(nom)
os.chdir('..')