Cách sao chép tất cả các tệp có trong thư mục này sang thư mục khác bằng Python. Tôi có đường dẫn nguồn và đường dẫn đích dưới dạng chuỗi.
Câu trả lời:
Bạn có thể sử dụng os.listdir () để lấy các tệp trong thư mục nguồn, os.path.isfile () để xem chúng có phải là tệp thông thường hay không (bao gồm các liên kết tượng trưng trên hệ thống * nix) và shutil.copy để sao chép.
Đoạn mã sau chỉ sao chép các tệp thông thường từ thư mục nguồn vào thư mục đích (tôi cho rằng bạn không muốn bất kỳ thư mục con nào được sao chép).
import os
import shutil
src_files = os.listdir(src)
for file_name in src_files:
full_file_name = os.path.join(src, file_name)
if os.path.isfile(full_file_name):
shutil.copy(full_file_name, dest)
dest
là tên thư mục. shutil.copy(src, dst)
"sao chép tệp src vào tệp hoặc thư mục dst .... Nếu dst chỉ định một thư mục, tệp sẽ được sao chép vào dst bằng cách sử dụng tên tệp cơ sở từ src."
Nếu bạn không muốn sao chép toàn bộ cây (với các thứ tự con, v.v.), hãy sử dụng hoặc glob.glob("path/to/dir/*.*")
để lấy danh sách tất cả các tên tệp, lặp qua danh sách và sử dụng shutil.copy
để sao chép từng tệp.
for filename in glob.glob(os.path.join(source_dir, '*.*')):
shutil.copy(filename, dest_dir)
Nhìn vào shutil trong tài liệu Python , cụ thể là lệnh copytree .
def recursive_copy_files(source_path, destination_path, override=False):
"""
Recursive copies files from source to destination directory.
:param source_path: source directory
:param destination_path: destination directory
:param override if True all files will be overridden otherwise skip if file exist
:return: count of copied files
"""
files_count = 0
if not os.path.exists(destination_path):
os.mkdir(destination_path)
items = glob.glob(source_path + '/*')
for item in items:
if os.path.isdir(item):
path = os.path.join(destination_path, item.split('/')[-1])
files_count += recursive_copy_files(source_path=item, destination_path=path, override=override)
else:
file = os.path.join(destination_path, item.split('/')[-1])
if not os.path.exists(file) or override:
shutil.copyfile(item, file)
files_count += 1
return files_count
import os
import shutil
os.chdir('C:\\') #Make sure you add your source and destination path below
dir_src = ("C:\\foooo\\")
dir_dst = ("C:\\toooo\\")
for filename in os.listdir(dir_src):
if filename.endswith('.txt'):
shutil.copy( dir_src + filename, dir_dst)
print(filename)
Đây là một ví dụ khác về hàm sao chép đệ quy cho phép bạn sao chép nội dung của thư mục (bao gồm cả các thư mục con) một tệp tại một thời điểm, mà tôi đã sử dụng để giải quyết vấn đề này.
import os
import shutil
def recursive_copy(src, dest):
"""
Copy each file from src dir to dest dir, including sub-directories.
"""
for item in os.listdir(src):
file_path = os.path.join(src, item)
# if item is a file, copy it
if os.path.isfile(file_path):
shutil.copy(file_path, dest)
# else if item is a folder, recurse
elif os.path.isdir(file_path):
new_dest = os.path.join(dest, item)
os.mkdir(new_dest)
recursive_copy(file_path, new_dest)
BIÊN TẬP: Nếu bạn có thể, chắc chắn chỉ cần sử dụng shutil.copytree(src, dest)
. Tuy nhiên, điều này yêu cầu rằng thư mục đích chưa tồn tại. Nếu bạn cần sao chép tệp vào một thư mục hiện có, phương pháp trên hoạt động tốt!