标准库:fileinput

 Lib/fileinput.py

import fileinput
for line in fileinput.input(encoding="utf-8"):
    process(line)

所有文件都默认以文本模式打开,但你可以通过在调用 input() 或 FileInput 时指定 mode 形参来重载此行为。 如果在打开或读取文件时发生了 I/O 错误,将会引发 OSError


fileinput

fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)

创建一个 FileInput 类的实例。 该实例将被用作此模块中函数的全局状态,并且还将在迭代期间被返回使用。 此函数的形参将被继续传递给 FileInput 类的构造器。

FileInput 实例可以在 with 语句中被用作上下文管理器。

with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding="utf-8") as f:
    for line in f:
        process(line)

fileinput.filename()

返回当前被读取的文件名。 在第一行被读取之前,返回 None

# 在程序的目录,新建一个data.txt

import fileinput

f = fileinput.input('data.txt', encoding='utf-8')

print(f.filename())     # 在第一行被读取之前,返回 None。
# output: None

for line in f:
    break

print(f.filename())
# output: data.txt

fileinput.fileno()

返回以整数表示的当前文件“文件描述符”。 当未打开文件时(处在第一行和文件之间),返回 -1

# 在程序的目录,新建一个data.txt

import fileinput

f = fileinput.input('data.txt', encoding='utf-8')

print('fileno:', f.fileno())     # 当未打开文件时(处在第一行和文件之间),返回 -1。
# output: fileno: -1

for line in f:
    print('line:',line.strip())
    break
# output: line: 1st

print('fileno:',f.fileno())
# output: fileno: 3

fileinput.lineno()

返回已被读取的累计行号。 在第一行被读取之前,返回 0。 在最后一个文件的最后一行被读取之后,返回该行的行号。

# 在程序的目录,新建一个data.txt

import fileinput

f = fileinput.input('data.txt', encoding='utf-8')

print('lineno:', f.lineno())  # 在第一行被读取之前,返回 0。
# output: lineno: 0

for line in f:
    print('line:', line.strip())    # 读取1行
# output: line: 1st
# output: line:
# output: line: 2rd
# output: line:
# output: line: 3th

print('lineno:', f.lineno())    # 返回已被读取的累计行号。
# output: lineno: 5

fileinput.filelineno()

返回当前文件中的行号。 在第一行被读取之前,返回 0。 在最后一个文件的最后一行被读取之后,返回此文件中该行的行号。

每次处理完一个文件并开始处理下一个文件时,该值会重置为1,重新开始计数。

# 在程序的目录,新建一个data.txt

import fileinput

f = fileinput.input('data.txt', encoding='utf-8')

print('filelineno:', f.filelineno())  # 在第一行被读取之前,返回 0。
# output: filelineno: 0

for line in f:
    print('line:', line.strip())    # 读取1行
# output: line: 1st
# output: line:
# output: line: 2rd
# output: line:
# output: line: 3th

print('filelineno:', f.filelineno())    # 返回已被读取的累计行号。
# output: filelineno: 5

fileinput.filelineno()

返回当前文件中的行号。 在第一行被读取之前,返回 0。 在最后一个文件的最后一行被读取之后,返回此文件中该行的行号。

# 在程序的目录,新建一个data.txt

import fileinput

f = fileinput.input('data.txt', encoding='utf-8')

print('isfirstline:', f.isfirstline())  # 在第一行被读取之前
# output: isfirstline: False

for line in f:
    if f.isfirstline():
        print('line:', line.strip())    # 读取1行
        print('isfirstline:', f.isfirstline())
        break

# output: line: 1st
# output: isfirstline: True

print('lineno:', f.lineno())    # 返回已被读取的累计行号。
# output: lineno: 1

fileinput.isstdin()

如果最后读取的行来自 sys.stdin 则返回 True,否则返回 False

# 在程序的目录,新建一个data.txt

import fileinput
import sys

# fileinput.input(),此程序会迭代sys.argv[1:]中列出的所有文件内的行,如果列表为空则会使用sys.stdin。
# 如果有一个文件名为'-',它也会被替换为sys.stdin并且可选参数mode和openhook会被忽略。

sys.argv.append('-')
f = fileinput.input(sys.argv[1:])
# f = fileinput.input()     # 或删除上两行,使用本行

for line in f:
    print(line)
    break
print('isstdin:', f.isstdin())

# input: 1
# output: 1
# output: isstdin: True

f.close()

f = fileinput.input('data.txt', encoding='utf-8')
for line in f:
    if f.isfirstline():
        print('line:', line.strip())  # 读取1行
        print('isstdin:', f.isstdin())
        break

# output: line: 1st
# output: isstdin: False

fileinput.nextfile()

关闭当前文件以使下次迭代将从下一个文件(如果存在)读取第一行;不是从该文件读取的行将不会被计入累计行数。 直到下一个文件的第一行被读取之后文件名才会改变。 在第一行被读取之前,此函数将不会生效;它不能被用来跳过第一个文件。 在最后一个文件的最后一行被读取之后,此函数将不再生效。

# 在程序的目录,新建一个data.txt

import fileinput

f = fileinput.input(('data.txt', 'data2.txt'), encoding='utf-8')
for line in f:
    if f.isfirstline():
        print('line:', line.strip())    # 一个文件读取1行
        print('isfirstline:', f.isfirstline())
        f.nextfile()    # 读取一行后跳到下个文件
        continue       # 继续下一循环
    break   # 所有文件读取一行后跳出循环
# output: line: 1st
# output: isfirstline: True
# output: line: 4th
# output: isfirstline: True

fileinput.close()

关闭序列。


写的小例子

# 在程序的目录,新建一个data.txt

import fileinput

f = fileinput.input('data.txt', encoding='utf-8', inplace=True)

for line in f:
    line = 'new line\n'     # 有内容才能写入
    print(line)

f.close()


fileinput.FileInput

此模块所提供的实现了序列行为的类同样也可用于子类化:

class fileinput.FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)

类 FileInput 是一个实现;它的方法 filename()fileno()lineno()filelineno()isfirstline()isstdin()nextfile() 和 close() 对应于此模块中具有相同名称的函数。 此外它还有一个 readline() 方法可返回下一个输入行,以及一个 __getitem__() 方法,该方法实现了序列行为。 这种序列必须以严格的序列顺序来读写;随机读写和 readline() 不可以被混用。

通过 mode 你可以指定要传给 open() 的文件模式。 它必须为 'r''rU''U' 和 'rb' 中的一个。

openhook 如果给出则必须为一个函数,它接受两个参数 filename 和 mode,并相应地返回一个打开的文件类对象。 你不能同时使用 inplace 和 openhook

你可以指定 encoding 和 errors 来将其传给 open() 或 openhook

FileInput 实例可以在 with 语句中被用作上下文管理器。 在这个例子中,input 在 with 语句结束后将会被关闭,即使发生了异常也是如此:

with FileInput(files=('spam.txt', 'eggs.txt')) as input:
    process(input)

可选的原地过滤: 如果传递了关键字参数 inplace=True 给 fileinput.input() 或 FileInput 构造器,则文件会被移至备份文件并将标准输出定向到输入文件(如果已存在与备份文件同名的文件,它将被静默地替换)。 这使得编写一个能够原地重写其输入文件的过滤器成为可能。 如果给出了 backup 形参 (通常形式为 backup='.<some extension>'),它将指定备份文件的扩展名,并且备份文件会被保留;默认情况下扩展名为 '.bak' 并且它会在输出文件关闭时被删除。 在读取标准输入时原地过滤会被禁用。

此模块提供了以下两种打开文件钩子:

fileinput.hook_compressed(filename, mode, *, encoding=None, errors=None)

使用 gzip 和 bz2 模块透明地打开 gzip 和 bzip2 压缩的文件(通过扩展名 '.gz' 和 '.bz2' 来识别)。 如果文件扩展名不是 '.gz' 或 '.bz2',文件会以正常方式打开(即使用 open() 并且不带任何解压操作)。

encoding 和 errors 值会被传给 io.TextIOWrapper 用于压缩文件以及打开普通文件。

用法示例: 

fi = fileinput.FileInput(openhook=fileinput.hook_compressed, encoding="utf-8")

fileinput.hook_encoded(encoding, errors=None)

返回一个通过 open() 打开每个文件的钩子,使用给定的 encoding 和 errors 来读取文件。

使用示例: 

fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))

# 在程序的目录,新建一个data.txt

import fileinput

f = fileinput.FileInput(files=('data.txt', 'data2.txt'), encoding='utf-8')
for line in f:
    if fileinput.FileInput.isfirstline(f):
        print('line:', line.strip())    # 一个文件读取1行
        print('isfirstline:', fileinput.FileInput.isfirstline(f))
        fileinput.FileInput.nextfile(f)    # 读取一行后跳到下个文件
        continue       # 继续下一循环
    break   # 所有文件读取一行后跳出循环

# output: line: 1st
# output: isfirstline: True
# output: line: 4th
# output: isfirstline: True


本次范例的文件结构:

  


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值