Cách di chuyển file trong python | Laptrinhcanban.com

Cách di chuyển file trong python

Hướng dẫn cách xử lý file trong Python. Bạn sẽ học được cách di chuyển file trong python bằng hàm shutil.move() trong module os, và ứng dụng để di chuyển file kết hợp đổi tên file, di chuyển toàn bộ file trong thư mục python, hay xử lý lỗi di chuyển file trong python khi thư mục đích đã có file khác cùng tên sau bài học này.

Di chuyển file trong python | shutil.move()

Chúng ta sử dụng shutil.move() trong python để di chuyển file hoặc thư mục đã tồn tại từ trước đó sang một thư mục mới, với cú pháp tổng quát sau đây:

shutil.move(src, dst, copy_function=copy2)

Trong đó:

  • src là đường dẫn nguồn
  • dst là đường dẫn đích
  • copy_function là hàm dùng khi di chuyển file hay thư mục. Mặc định hàm này là copy2 nhằm lấy được cả metadata của file hay thư mục gốc.

Thông thường chúng ta lược bỏ đối số copy_function=copy2 và sử dụng cú pháp rút gọn của shutil.move() trong python để di chuyển file.

Giả sử bạn có một thư mục có cấu trúc như sau:

data
├── user
│   ├── dir
│   └── user.txt
├── client
└── move.py

Bạn muốn di chuyển file user.txt từ thư mục user sang thư mục client, hãy chỉ định src là đường dẫn file user.txtdst là đường dẫn thư mục client như sau:

import shutil
shutil.move('./user/user.txt', './client/')

Sau khi chạy lệnh, một file mới có cùng tên user.txt và metadata(thời gian tạo, thời gian sửa file v.v) cũng như quyền truy cập sẽ được tạo ở thư mục client. Sau đó, file gốc user.txt trong thư mục user sẽ được xóa đi và kết thúc quá trình di chuyển file trong python.

Lưu ý, nếu như bạn muốn di chuyển file tới một thư mục mà thư mục đó vốn không tồn tại, ví dụ như là thư mục serve, lỗi sẽ xảy ra:

shutil.move('./user/user.txt', './serve/')
#FileNotFoundError: [Errno 2] No such file or directory: './serve/'

Để tránh lỗi này, hãy tạo thư mục đó nếu như nó chưa tồn tại, trước khi di chuyển file trong python, bằng cách sử dụng os.makedirs() như sau:

import shutil
import os
os.makedirs('./serve', exist_ok=True)
shutil.move('./user/user.txt', './serve/')

Di chuyển và đổi tên file trong python

Ở phần trên chúng ta đã biết, khi chỉ định đối số dst trong shutil.move() bằng một đường dẫn thư mục, tên file sẽ không đổi trước và sau khi di chuyển.

Nếu bạn muốn di chuyển file và đổi tên file đó thành một tên khác trong python, hãy chỉ định đối số dst thành đường dẫn của file với tên file mới, giống như ví dụ sau đây:

import shutil
shutil.move('./user/user.txt', './client/user_infor.txt')

Lưu ý, nếu như thư mục đích không tồn tại, lỗi cũng sẽ xảy ra. Hãy giải quyết lỗi như cách Kiyoshi đã chỉ ở trên.

Di chuyển file trong python khi thư mục đích đã có file khác cùng tên.

Trong trường hợp chúng ta muốn di chuyển một file mà ở thư mục đích, một file khác cùng tên đã tồn tại trước đó, nếu bạn dùng hệ điều hành Mac hay Linux, file ở thư mục đích sẽ bị ghi đè, còn nếu bạn dùng Windows, lỗi sau đây sẽ xảy ra:

shutil.Error: Destination path './client/user.txt' already exists

Nếu bạn dùng Windows, để tránh lỗi xảy ra, bạn có thể xóa file cũ đi hoặc là đổi tên file đó trước khi tiến hành di chuyển file như sau:

import shutil
import os

src='./user/user.txt'
dst='./client/user.txt'

if os.path.exists(dst):
os.rename(dst,'./client/user_old.tx') #hoặc os.remove(dst)
shutil.move(src, dst)

Trong đó os.rename() dùng để đổi tên file trong pythonos.remove() dùng để xóa file trong python.

Di chuyển toàn bộ file trong thư mục python

Để di chuyển toàn bộ file trong thư mục python sang một thư mục mới, chúng ta cần kết hợp Lấy danh sách tên file trong thư mục python và dùng lệnh for để di chuyển từng file sang thư mục mới.

Giả sử chúng ta có thư mục có cấu trúc như sau:

data/
├── dir1
├── dir2
│   ├── 123.txt
│   ├── 789.txt
│   ├── abc.txt
│   └── dir3
├── client
└── move.py

Nếu chúng ta muốn chuyển toàn bộ file và thư mục trong thư mục dir2 sang thư mục dir, hãy viết chương trình như sau:

src_dir = './dir2/'
dst_dir = './dir1/'

for file_folder in os.listdir(src_dir):
file_folder_path=os.path.join(src_dir, file_folder)
shutil.move(file_folder_path, dst_dir)

Chúng ta dùng os.listdir() để lấy danh sách toàn bộ tên file và thư mục chứa trong src_dir và di chuyển từng đối tượng sang thư mục mới. Kết quả thư mục sẽ như sau:

data/
├── dir1
│   ├── 123.txt
│   ├── 789.txt
│   ├── abc.txt
│   └── dir3
├── dir2  
├── client
└── move.py

Trong trường hợp chúng ta chỉ muốn di chuyển file và giữ nguyên thư mục con hoặc ngược lại, hãy thêm lệnh kiểm tra đường dẫn là file hay thư mục vào chương trình như bằng cách sử dụng os.path.isfile() hoặc os.path.isdir() như sau:

src_dir = './dir2/'
dst_dir = './dir1/'

for file_folder in os.listdir(src_dir):
file_path=os.path.join(src_dir, file_folder)
if os.path.isfile(file_path):
shutil.move(, dst_dir)

Tổng kết và thực hành

Trên đây Kiyoshi đã hướng dẫn bạn về cách di chuyển file trong python rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về python trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.