Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Lặp qua các dòng từ nhiều luồng đầu vào trong Python

Hàm built-in open() của Python mở một tệp ở chế độ đọc/ghi và thực hiện các thao tác đọc/ghi trên nó. Để thực hiện xử lý trên nhiều tệp theo lô, người ta phải sử dụng module fileinput của thư viện chuẩn Python. Module này cung cấp lớp FileInput với chức năng lặp qua các tệp. Module cũng định nghĩa các hàm trợ giúp cho cùng mục đích.

Giao diện chính của module này là hàm input(). Hàm này trả về thể hiện của lớp FileInput.

fileinput.input(files, inplace, mode)

Tham số files là tên của một hoặc nhiều tệp được đọc lần lượt. Mỗi tệp đóng vai trò như một generator và sử dụng vòng lặp for có thể lặp qua nó. Mỗi dòng trong tệp sẽ được in ra console Python.

>>> for line in fileinput.input('data.txt'):
...     print(line)

Tham số files có thể là một tuple bao gồm nhiều tệp. Nội dung các tệp sẽ được hiển thị lần lượt.

>>> for line in fileinput.input(files=('a.txt', 'b.txt')):
...     print(line)

Lớp FileInput cũng có thể được dùng như một context manager trong câu lệnh with.

>>> with fileinput.input(files=('a.txt', 'b.txt')) as f:
...     for line in f:
...         print(line)

Module fileinput có các hàm sau được định nghĩa trong nó:

STT Hàm & Mô tả
1 filename()
Trả về tên của tệp hiện đang được đọc.
2 fileno()
Trả về số mô tả tệp (file descriptor) dạng số nguyên.
3 lineno()
Trả về số dòng của tệp đang được đọc. Số này là đếm tích lũy.
4 filelineno()
Trả về số dòng của tệp hiện tại chỉ.
5 isfirstline()
Trả về true nếu dòng đầu tiên của tệp hiện tại đang được đọc, false ngược lại.

Câu lệnh sau in mỗi dòng trong tệp cùng với số dòng:

>>> for line in fileinput.input('books.py'):
...     print('{}->{}'.format(fileinput.filelineno(), line))

Đầu ra mẫu của mã trên là:

1->import sqlite3
2->conn = sqlite3.connect('c:/python36/books.db')
3->cursor = conn.cursor()
4->cursor.execute("SELECT * from books;")
5->print(cursor.fetchall())

Mã sau in tên mỗi tệp trong thư mục theo sau là các dòng được đánh số trong nó. Trong chương trình này, hàm glob() được sử dụng trả về danh sách tệp trong đường dẫn hiện tại tùy chọn với ký tự đại diện. Ở đây glob('*.py') sẽ trả về danh sách tất cả các tệp với phần mở rộng .py trong thư mục hiện tại. Danh sách này được dùng làm tham số files cho hàm fileinput.input().

import fileinput, glob, sys
for line in fileinput.input(glob.glob("*.py")):
    if fileinput.isfirstline():
        print(fileinput.filename(), '>')
    sys.stdout.write("{}.{}".format(fileinput.filelineno(), line))

Lưu ý việc sử dụng hàm isfirstline(). Khi lặp của tệp mới bắt đầu, hàm này trả về true và tên tệp như được trả về bởi hàm fileinput.filename() được in trước, sau đó các dòng có số được hiển thị. Ví dụ:

1.py >
1.a = 10
2.b = 20
3.print('addition=', a+b)
hello.py >
1.x = 10
2.y = 20
3.z = x+y
4.print("x+y=", z)

Tham số inplace

Mặc định, inplace=False cho hàm fileinput.input(). Nếu được đặt thành True, nó làm cho tệp đầu vào có thể ghi được.

Giả sử có tệp msg.txt với văn bản sau:

Hello Python. Good morning

Mã sau mở tệp sử dụng module fileinput và sửa đổi nội dung của nó tại chỗ.

>>> for line in fileinput.input(files='msg.txt', inplace=True):
...     line = line.replace('morning', 'evening')
...     sys.stdout.write(line)

Tệp msg.txt sẽ hiển thị các thay đổi đã thực hiện.