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
本次范例的文件结构: