Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Chỉnh sửa file trực tiếp bằng module fileinput trong Python
Khi làm việc, bạn thường phải chỉnh sửa nội dung trong các file hiện có. Ví dụ, một phần mềm được cập nhật và bạn cần thay đổi số phiên bản, hoặc bạn đổi tên các tài nguyên như file dữ liệu hay hình ảnh. Nếu chỉ là một file , bạn có thể mở và chỉnh sửa bằng trình soạn thảo yêu thích. Nhưng nếu cần xử lý nhiều file , việc viết một script Python sẽ hiệu quả hơn.
Bài viết này hướng dẫn bạn cách sử dụng module fileinput
để chỉnh sửa và cập nhật trực tiếp nội dung các file .
Theo tài liệu chính thức của Python:
Module
fileinput
cung cấp một lớp và các hàm hỗ trợ để dễ dàng duyệt qua dữ liệu từ đầu vào chuẩn hoặc một danh sách file . Nếu bạn chỉ cần đọc hoặc ghi một file , hãy sử dụng hàmopen()
.Bài viết này được đăng tại [free tuts .net]
Sử dụng đối số files
trong dòng lệnh trong Python
Giả sử bạn có hai file văn bản như sau:
$ ls *.txt notes.txt tools.txt $ cat tools.txt /home/learnbyexample/programs/command_help.sh /home/learnbyexample/bkp/calc.py /home/learnbyexample/programs/remove_duplicates.sh /home/learnbyexample/programs/calc.py $ cat notes.txt Tool: /home/learnbyexample/programs/remove_duplicates.sh * retains only first copy of duplicate lines * maintains input order
Bạn vừa đổi tên thư mục từ programs
thành bin
. Dưới đây là cách cập nhật nội dung cả hai file bằng module fileinput
. Đặt tham số inplace
thành True
để cho phép ghi đè nội dung file gốc.
Mã nguồn:
# change_path.py import fileinput with fileinput.input(inplace=True) as f: for ip_line in f: op_line = ip_line.replace('/programs/', '/bin/') print(op_line, end='')
Sau đó, chạy chương trình bằng cách chỉ định tên file trong dòng lệnh:
$ python3 change_path.py *.txt $ cat tools.txt /home/learnbyexample/bin/command_help.sh /home/learnbyexample/bkp/calc.py /home/learnbyexample/bin/remove_duplicates.sh /home/learnbyexample/bin/calc.py $ cat notes.txt Tool: /home/learnbyexample/bin/remove_duplicates.sh * retains only first copy of duplicate lines * maintains input order
Xử lý dữ liệu từ stdin
Nếu không chỉ định file , fileinput.input()
sẽ tự động lấy dữ liệu từ stdin. Nếu tham số inplace
là True
, stdin sẽ bị bỏ qua.
Ví dụ:
$ echo '/home/user/programs/create_venv.py' | python3 change_path.py /home/user/bin/create_venv.py
Chỉ định danh sách file trong mã nguồn
Nếu đã biết trước các file cần chỉnh sửa, bạn có thể truyền danh sách file vào tham số files
.
Mã nguồn:
# file_list.py import fileinput ip_files = ('notes.txt', 'tools.txt') with fileinput.input(files=ip_files, inplace=True) as f: for ip_line in f: op_line = ip_line.replace('/programs/', '/bin/') print(op_line, end='')
Sau khi đã chỉ định danh sách file trong mã nguồn, bạn chỉ cần chạy chương trình mà không cần thêm đối số dòng lệnh:
$ python3 file_list.py
Tạo bản sao lưu trước khi chỉnh sửa trong Python
Khi chỉnh sửa file , bạn nên tạo bản sao lưu để tránh mất dữ liệu nếu có lỗi xảy ra. Tham số backup
cho phép tạo bản sao của file gốc với phần mở rộng được chỉ định.
Ví dụ:
Giả sử bạn cần thay thế từ blue
thành brown
trong file sau:
$ cat colors.txt red blue green teal magenta dark-blue sea-green
Mã nguồn:
# inplace_with_backups.py import fileinput with fileinput.input(files='colors.txt', inplace=True, backup='.orig') as f: for ip_line in f: op_line = ip_line.replace('blue', 'brown') print(op_line, end='')
Khi chạy chương trình, file gốc sẽ được sao lưu với phần mở rộng .orig
:
$ python3 inplace_with_backups.py # file đã chỉnh sửa $ cat colors.txt red brown green teal magenta dark-brown sea-green # Bản sao gốc $ cat colors.txt.orig red blue green teal magenta dark-blue sea-green