ฟังก์ชัน built-in open() ของ Python เปิดไฟล์เดียวในโหมดอ่าน/เขียน และดำเนินการอ่าน/เขียนบนมัน เพื่อประมวลผลหลายไฟล์เป็นชุด (batch) ต้องใช้โมดูล fileinput ของไลบรารีมาตรฐาน Python โมดูลนี้ให้คลาส Fileinput พร้อมฟังก์ชันการวนลูปผ่านไฟล์ โมดูลยังนิยามฟังก์ชันช่วยเหลือสำหรับวัตถุประสงค์เดียวกัน
อินเตอร์เฟซหลักของโมดูลนี้คือฟังก์ชัน input() ฟังก์ชันนี้คืนค่าอินสแตนซ์ของคลาส Fileinput
fileinput.input(files, inplace, mode)
พารามิเตอร์ files คือชื่อไฟล์หนึ่งหรือหลายไฟล์ที่จะอ่านทีละไฟล์ แต่ละไฟล์ทำหน้าที่เป็น generator และใช้ for loop วนลูปได้ แต่ละบรรทัดในไฟล์จะถูกพิมพ์บนคอนโซล Python
>>> for line in fileinput.input('data.txt'):
... print(line)
พารามิเตอร์ files สามารถเป็น tuple ที่ประกอบด้วยหลายไฟล์ เนื้อหาของไฟล์จะแสดงทีละไฟล์:
>>> for line in fileinput.input(files=('a.txt', 'b.txt')):
... print(line)
คลาส Fileinput ยังสามารถใช้เป็น context manager ในคำสั่ง with ได้:
>>> with fileinput.input(files=('a.txt', 'b.txt')) as f:
... for line in f:
... print(line)
โมดูล fileinput มีฟังก์ชันดังต่อไปนี้:
| ลำดับ | ฟังก์ชัน & คำอธิบาย |
|---|---|
| 1 | filename() คืนชื่อไฟล์ที่กำลังอ่านอยู่ |
| 2 | fileno() คืนค่า file descriptor เป็นจำนวนเต็ม |
| 3 | lineno() คืนค่าหมายเลขบรรทัดของไฟล์ที่กำลังอ่าน เป็นจำนวนสะสม |
| 4 | filelineno() คืนค่าหมายเลขบรรทัดของไฟล์ปัจจุบันอย่างเดียว |
| 5 | isfirstline() คืนค่า true หากกำลังอ่านบรรทัดแรกของไฟล์ปัจจุบัน false ถ้าไม่ใช่ |
คำสั่งต่อไปนี้พิมพ์แต่ละบรรทัดในไฟล์พร้อมหมายเลขบรรทัด:
>>> for line in fileinput.input('books.py'):
... print('{}->{}'.format(fileinput.filelineno(), line))
ตัวอย่าง output ของโค้ดด้านบน:
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())
โค้ดต่อไปนี้พิมพ์ชื่อไฟล์แต่ละไฟล์ในโฟลเดอร์ ตามด้วยบรรทัดที่มีหมายเลข ในโปรแกรมนี้ใช้ฟังก์ชัน glob() ซึ่งคืนค่าลิสต์ไฟล์ใน path ปัจจุบัน พร้อม wildcard matching ที่นี่ glob('*.py') จะคืนลิสต์ไฟล์ทั้งหมดที่มี副檔名 .py ในโฟลเดอร์ปัจจุบัน ลิสต์นี้ใช้เป็นพารามิเตอร์ files สำหรับ 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))
สังเกตการใช้ฟังก์ชัน isfirstline() เมื่อการวนลูปของไฟล์ใหม่เริ่มต้น ฟังก์ชันนี้คืนค่า true และชื่อไฟล์ที่คืนจาก fileinput.filename() จะถูกพิมพ์ก่อน จากนั้นบรรทัดที่มีหมายเลขจะแสดง ตัวอย่าง:
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)
พารามิเตอร์ inplace
โดยค่าเริ่มต้น inplace = False สำหรับ fileinput.input() หากตั้งเป็น True จะทำให้ไฟล์ input เขียนได้
สมมติว่ามี 'msg.txt' ด้วยข้อความดังนี้:
Hello Python. Good morning
โค้ดต่อไปนี้เปิดไฟล์ด้วยโมดูล fileinput และแก้ไขเนื้อหาในที่เลย (in place):
>>> for line in fileinput.input(files='msg.txt', inplace=True):
... line = line.replace('morning', 'evening')
... sys.stdout.write(line)
'msg.txt' จะแสดงการเปลี่ยนแปลงที่ทำ