程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

fileinput library in Python

編輯:Python

文章目錄

  • fileinput庫
    • 一、 簡介
    • 二、 常用函數
      • 1、 描述
      • 2、 第一個程序
    • 三、 函數參數
      • 1、參數
      • 2、 批量處理
      • 3、 修改備份
    • 四、鉤子函數
      • 1、 內置函數
      • 2、 自定義函數

fileinput庫

一、 簡介

說到fileinput,可能90%的碼農表示沒用過,甚至沒有聽說過.
這不奇怪,因為在python界,既然open可以走天下,何必要fileinput呢?.

其為open方法的高級封裝:

fileinput模塊可以對一個或多個文件中的內容進行迭代、遍歷等操作.

該模塊的input()函數有點類似文件readlines()方法,區別在於:

前者是一個迭代對象,即每次只生成一行,需要用for循環迭代.

後者是一次性讀取所有行.在碰到大文件的讀取時,前者無疑效率更高效.

用fileinput對文件進行循環遍歷,格式化輸出,查找、替換等操作,非常方便.

二、 常用函數

1、 描述

fileinput.input() # 進行讀取文件對象的初始化,返回能夠用於for循環遍歷的對象
# return FileInput(files, inplace, backup, mode=mode, openhook=openhook)
fileinput.filename() # 返回當前文件的名稱
# return fileInput.filename()
fileinput.lineno() # 返回當前已經讀取的行的數量(或者序號)
# return fileInput.lineno()
fileinput.filelineno() # 返回當前讀取的行的行號
# return fileInput.filelineno()
fileinput.isfirstline() # 檢查當前行是否是文件的第一行
# return fileInput.isfirstline()
fileinput.isstdin() # 判斷最後一行是否從stdin中讀取
# return fileInput.isstdin()
fileinput.close() # 關閉隊列,也是關閉文件
fileinput.nextfile() # 關閉當前文件以使下次迭代將從下一個文件(如果存在)讀取第一行;不是從該文件讀取的行將不會被計入累計行數.直到下一個文件的第一行被讀取之後文件名才會改變.
# —>在第一行被讀取之前,此函數將不會生效;它不能被用來跳過第一個文件.
# —>在最後一個文件的最後一行被讀取之後,此函數將不再生效.

2、 第一個程序

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "[email protected]"
import fileinput
# 典型用法
for line in fileinput.input(): # 如果input函數裡面不傳入參數,則,我們需要從命令行傳入文件路徑
print(line)
python demo02.py 1.txt 2.txt

三、 函數參數

1、參數

我們使用input方法打開文件

fileinput.input(files=None, inplace=False, backup="", bufsize=0, *, mode="r", openhook=None)

參數:

  • files:默認是stdin方式 ,傳入要打開的文件,可以傳入一個文件列表,打開多個文件
  • inplace:是否將標准輸出的結果寫回文件,默認不取代
  • backup:備份文件的擴展名,只指定擴展名,如.bak.如果該文件的備份文件已存在,則會自動覆蓋.
  • bufsize:緩沖區大小,默認為0,如果文件很大,可以修改此參數,一般默認即可
  • mode: 讀寫模式,默認為只讀
  • openhook:鉤子函數, 該鉤子用於控制打開的所有文件,比如說編碼方式等,返回一個文件對象

2、 批量處理

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "[email protected]"
import fileinput
from glob import glob # 使用正則匹配文件
with fileinput.input(files=glob("*.txt"), openhook=fileinput.hook_encoded("utf-8")) as f: # 讀取當前目錄下,所有的txt文件
for line in f:
print(f"{
fileinput.filename()} -> {
line.strip()} | 第{
fileinput.filelineno()}行 | 共讀取{
fileinput.lineno()}行")

3、 修改備份

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "[email protected]"
import fileinput
from glob import glob # 使用正則匹配文件
with fileinput.input(files=glob("*.txt"), inplace=True, backup=".bak") as f: # 讀取當前目錄下,所有的txt文件,同時新建一個備份文件文件,可以不新建備份文件
for line in f:
print(f"{
fileinput.filename()} -> {
line.strip()} | 第{
fileinput.filelineno()}行 | 共讀取{
fileinput.lineno()}行") # 在for循環裡面的print內容不會輸出到控制台上,而是直接輸出到文件對應的行裡面

四、鉤子函數

在 fileinput.input() 中有一個 openhook 的參數,它支持用戶傳入自定義的對象讀取方法;

  • 如果沒有傳入任何勾子,fileinput 默認使用的是 open 函數

1、 內置函數

fileinput 內置了兩種勾子

  1. fileinput.hook_compressed(filename, mode)

    使用 gzip 和 bz2 模塊透明地打開 gzip 和 bzip2 壓縮的文件(通過擴展名 ‘.gz’ 和 ‘.bz2’ 來識別);
    如果文件擴展名不是 ‘.gz’ 或 ‘.bz2’,文件會以正常方式打開(即使用 open() 並且不帶任何解壓操作);
    使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_compressed)

  2. fileinput.hook_encoded(encoding, errors=None)

    返回一個通過 open() 打開每個文件的鉤子,使用給定的 encoding 和 errors 來讀取文件.
    使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_encoded(“utf-8”, “surrogateescape”))

2、 自定義函數

我們定義一個鉤子函數,來實現讀取網絡資源

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "[email protected]"
import fileinput
from glob import glob # 使用正則匹配文件
from io import StringIO
from requests import get
def getOnlineSource(url, *args, **kwargs):
resp = get(url)
resp.encoding = resp.apparent_encoding
return StringIO(resp.text) # 文件對象即為字符串流
with fileinput.input("http://www.baidu.com", openhook=getOnlineSource) as f: # 獲取對應url中的資源,並輸出
for line in f:
print(line) # 輸出每一行內容,即,等於是輸出io流中的所有內偶然

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved