Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การวนลูปบรรทัดจากหลาย input streams ใน Python

ฟังก์ชัน 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' จะแสดงการเปลี่ยนแปลงที่ทำ