fileinput --- Lặp lại các dòng từ nhiều luồng đầu vào¶
Source code: Lib/fileinput.py
Mô-đun này triển khai một lớp trợ giúp và các chức năng để nhanh chóng viết một vòng lặp qua đầu vào tiêu chuẩn hoặc danh sách các tệp. Nếu bạn chỉ muốn đọc hoặc ghi một tập tin, hãy xem open().
Việc sử dụng điển hình là:
nhập tập tin đầu vào
cho dòng trong fileinput.input(encoding="utf-8"):
quá trình (dòng)
Điều này lặp lại các dòng của tất cả các tệp được liệt kê trong sys.argv[1:], mặc định là sys.stdin nếu danh sách trống. Nếu tên tệp là '-', nó cũng được thay thế bằng sys.stdin và các đối số tùy chọn mode và openhook sẽ bị bỏ qua. Để chỉ định danh sách tên tệp thay thế, hãy chuyển nó làm đối số đầu tiên cho input(). Một tên tập tin duy nhất cũng được cho phép.
Tất cả các tệp được mở ở chế độ văn bản theo mặc định, nhưng bạn có thể ghi đè điều này bằng cách chỉ định tham số mode trong lệnh gọi tới input() hoặc FileInput. Nếu xảy ra lỗi I/O trong khi mở hoặc đọc tệp, OSError sẽ xuất hiện.
Nếu sys.stdin được sử dụng nhiều lần, lần sử dụng thứ hai trở đi sẽ không trả về dòng nào, ngoại trừ mục đích sử dụng tương tác hoặc nếu nó đã được đặt lại rõ ràng (ví dụ: sử dụng sys.stdin.seek(0)).
Các tập tin trống được mở và đóng ngay lập tức; lần duy nhất sự hiện diện của chúng trong danh sách tên tệp được chú ý là khi tệp cuối cùng được mở trống.
Các dòng được trả về với bất kỳ dòng mới nào còn nguyên vẹn, điều đó có nghĩa là dòng cuối cùng trong một tệp có thể không có dòng nào.
Bạn có thể kiểm soát cách mở tệp bằng cách cung cấp móc mở thông qua tham số openhook cho fileinput.input() hoặc FileInput(). Hook phải là một hàm nhận vào hai đối số, filename và mode, rồi trả về một đối tượng giống như tệp được mở tương ứng. Nếu encoding và/hoặc errors được chỉ định, chúng sẽ được chuyển đến hook dưới dạng đối số từ khóa bổ sung. Mô-đun này cung cấp hook_compressed() để hỗ trợ các tệp nén.
Chức năng sau đây là giao diện chính của mô-đun này:
- fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)¶
Tạo một thể hiện của lớp
FileInput. Phiên bản này sẽ được sử dụng làm trạng thái chung cho các chức năng của mô-đun này và cũng được trả về để sử dụng trong quá trình lặp lại. Các tham số cho hàm này sẽ được chuyển đến hàm tạo của lớpFileInput.Phiên bản
FileInputcó thể được sử dụng làm trình quản lý bối cảnh trong câu lệnhwith. Trong ví dụ này, input bị đóng sau khi thoát câu lệnhwith, ngay cả khi xảy ra ngoại lệ:với fileinput.input(files=('spam.txt', 'eggs.txt'), mã hóa="utf-8") là f: cho dòng trong f: quá trình (dòng)
Thay đổi trong phiên bản 3.2: Có thể được sử dụng như một trình quản lý bối cảnh.
Thay đổi trong phiên bản 3.8: Các thông số từ khóa mode và openhook hiện chỉ có từ khóa.
Thay đổi trong phiên bản 3.10: Tham số chỉ từ khóa encoding và errors được thêm vào.
Các hàm sau sử dụng trạng thái chung được tạo bởi fileinput.input(); nếu không có trạng thái hoạt động, RuntimeError sẽ được nâng lên.
- fileinput.filename()¶
Trả về tên file hiện đang được đọc. Trước khi dòng đầu tiên được đọc, trả về
None.
- fileinput.fileno()¶
Trả về số nguyên "bộ mô tả tệp" cho tệp hiện tại. Khi không có tệp nào được mở (trước dòng đầu tiên và giữa các tệp), trả về
-1.
- fileinput.lineno()¶
Trả về số dòng tích lũy của dòng vừa đọc. Trước khi dòng đầu tiên được đọc, trả về
0. Sau khi dòng cuối cùng của tệp cuối cùng được đọc, trả về số dòng của dòng đó.
- fileinput.filelineno()¶
Trả về số dòng trong tập tin hiện tại. Trước khi dòng đầu tiên được đọc, trả về
0. Sau khi dòng cuối cùng của tệp cuối cùng được đọc, trả về số dòng của dòng đó trong tệp.
- fileinput.isfirstline()¶
Trả về
Truenếu dòng vừa đọc là dòng đầu tiên trong tệp của nó, nếu không thì trả vềFalse.
- fileinput.isstdin()¶
Trả về
Truenếu dòng cuối cùng được đọc từsys.stdin, nếu không thì trả vềFalse.
- fileinput.nextfile()¶
Đóng tệp hiện tại để lần lặp tiếp theo sẽ đọc dòng đầu tiên của tệp tiếp theo (nếu có); các dòng không được đọc từ tệp sẽ không được tính vào số dòng tích lũy. Tên tệp không được thay đổi cho đến khi dòng đầu tiên của tệp tiếp theo được đọc. Trước khi dòng đầu tiên được đọc, chức năng này không có tác dụng; nó không thể được sử dụng để bỏ qua tập tin đầu tiên. Sau khi dòng cuối cùng của tập tin cuối cùng được đọc, chức năng này không có hiệu lực.
- fileinput.close()¶
Đóng trình tự.
Lớp thực hiện hành vi trình tự do mô-đun cung cấp cũng có sẵn để phân lớp:
- class fileinput.FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)¶
Lớp
FileInputlà phần triển khai; các phương thức của nófilename(),fileno(),lineno(),filelineno(),isfirstline(),isstdin(),nextfile()vàclose()tương ứng với các chức năng cùng tên trong mô-đun. Ngoài ra, nó là iterable và có phương thứcreadline()trả về dòng đầu vào tiếp theo. Trình tự phải được truy cập theo thứ tự nghiêm ngặt; truy cập ngẫu nhiên vàreadline()không thể trộn lẫn được.Với mode bạn có thể chỉ định chế độ tệp nào sẽ được chuyển tới
open(). Nó phải là một trong'r'và'rb'.openhook, khi được đưa ra, phải là một hàm nhận hai đối số, filename và mode, rồi trả về một đối tượng giống như tệp được mở tương ứng. Bạn không thể sử dụng inplace và openhook cùng nhau.
Bạn có thể chỉ định encoding và errors được chuyển tới
open()hoặc openhook.Một phiên bản
FileInputcó thể được sử dụng làm trình quản lý bối cảnh trong câu lệnhwith. Trong ví dụ này, input bị đóng sau khi thoát câu lệnhwith, ngay cả khi xảy ra ngoại lệ:với FileInput(files=('spam.txt', 'eggs.txt')) làm đầu vào: quá trình (đầu vào)
Thay đổi trong phiên bản 3.2: Có thể được sử dụng như một trình quản lý bối cảnh.
Thay đổi trong phiên bản 3.8: Tham số từ khóa mode và openhook hiện chỉ có từ khóa.
Thay đổi trong phiên bản 3.10: Tham số chỉ từ khóa encoding và errors được thêm vào.
Thay đổi trong phiên bản 3.11: Các chế độ
'rU'và'U'và phương thức__getitem__()đã bị xóa.
Optional in-place filtering: nếu đối số từ khóa inplace=True được chuyển tới fileinput.input() hoặc tới hàm tạo FileInput, tệp sẽ được chuyển sang tệp sao lưu và đầu ra tiêu chuẩn được chuyển hướng đến tệp đầu vào (nếu tệp có cùng tên với tệp sao lưu đã tồn tại, nó sẽ được thay thế một cách âm thầm). Điều này cho phép viết một bộ lọc ghi lại tệp đầu vào của nó tại chỗ. Nếu tham số backup được cung cấp (thường là backup='.<some extension>'), nó sẽ chỉ định phần mở rộng cho tệp sao lưu và tệp sao lưu vẫn còn nguyên; theo mặc định, phần mở rộng là '.bak' và nó sẽ bị xóa khi đóng tệp đầu ra. Tính năng lọc tại chỗ bị tắt khi đọc đầu vào tiêu chuẩn.
Hai móc mở sau đây được cung cấp bởi mô-đun này:
- fileinput.hook_compressed(filename, mode, *, encoding=None, errors=None)¶
Mở các tệp được nén bằng gzip và bzip2 một cách trong suốt (được nhận dạng bởi các phần mở rộng
'.gz'và'.bz2') bằng cách sử dụng mô-đungzipvàbz2. Nếu phần mở rộng tên tệp không phải là'.gz'hoặc'.bz2', tệp sẽ được mở bình thường (tức là sử dụngopen()mà không cần giải nén).Các giá trị encoding và errors được chuyển tới
io.TextIOWrapperđối với các tệp nén và mở đối với các tệp thông thường.Ví dụ sử dụng:
fi = fileinput.FileInput(openhook=fileinput.hook_compressed, encoding="utf-8")Thay đổi trong phiên bản 3.10: Tham số chỉ từ khóa encoding và errors được thêm vào.
- fileinput.hook_encoded(encoding, errors=None)¶
Trả về một hook mở từng tệp bằng
open(), sử dụng encoding và errors đã cho để đọc tệp.Ví dụ sử dụng:
fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))Thay đổi trong phiên bản 3.6: Đã thêm tham số errors tùy chọn.
Sắp loại bỏ từ phiên bản 3.10: Chức năng này không được dùng nữa vì
fileinput.input()vàFileInputhiện có các tham số encoding và errors.