以下主要是针对Python3中内置模块(fileinput)介绍和示例。
fileinput模块
在接触新的模块之前,我们先来尝试通过Python内置的函数open进行文件的读写。
1、文件的读取
示例代码:
path = r'C:\Users\Administrator\Desktop\song\lyric.txt' # 设置读取文件的路径
file = open(path, 'r') # 打开文件存入变量,‘r’(read)为只读模式。
while True: # 循环
line = file.readline() # 读取一行内容存入变量
if line: # 如果变量不是空值(末尾行为空值)
print(line, end='') # 显示输出读取结果,设置不换行输出(文本的每一行都带有换行符)。
else: # 否则
break # 结束循环
file.close() # 关闭文件
在上方代码中,我们通过本地路径读取了一个文本文件,并将内容逐行显示输出。
需要注意的是,读取结束后要通过close()方法,将文件对象关闭。
不过,关闭文件对象的操作,很容易被忘记,并且,通过while循环读取文件的每一行感觉很麻烦。
接下来,我们通过for循环来读取文件内容,并且结合关键字with打开文件。
使用关键字with进行文件的打开操作,文件对象会在语句块执行结束后自动关闭。
示例代码:
path = r'C:\Users\Administrator\Desktop\song\lyric.txt' # 设置读取文件的路径
with open(path, 'r') as file: # 结合with关键字打开文件并存入变量
for line in file: # 如果变量不是空值(末尾行为空值)
print(line.replace('\n', '')) # 显示输出读取结果,替换掉每行内容末尾的换行符。
2、文件的创建\清空\写入
打开文件时,指定模式为’w’(write),如果文件不存在,则会创建;如果文件存在,则会打开后清空。
示例代码:
path = r'C:\Users\Administrator\Desktop\song\test.txt'
with open(path, 'w') as file: # 创建文件或清空文件内容
file.write('小明真的好帅好帅的!') # 写入内容
注意:写入内容时,如果需要换行需要显式的加入换行符。
3、文件的追加
打开文件时,指定模式为’a’(append),就能够在文件末尾追加内容;如果文件不存在,则会创建。
示例代码:
path = r'C:\Users\Administrator\Desktop\song\lyric.txt'
with open(path, 'a') as file: # 文件追加内容
file.write('这是我很喜欢的一首歌!') # 文件内容末尾写入一行内容
4、覆盖
打开文件时,指定模式为’r+’,能够在开始位置写入新内容,覆盖同等字符数量的原内容。
注意:’+’表示可对文件进行写入或读取,但不可单独出现。
示例代码:(覆盖)
path = r'C:\Users\Administrator\Desktop\song\test.txt' # 假设当前文件内容为“abcde”。
with open(path, 'r+') as file: # 设置打开模式为读写模式。
file.write('aaa') # 程序执行后,文件内容变更为“aaade”。
这种模式下,也能够实现追加。
示例代码:(追加)
path = r'C:\Users\Administrator\Desktop\song\test.txt' # 假设当前文件内容为“abcde”。
with open(path, 'r+') as file: # 设置打开模式为读写模式。
file.read() # 读取至末尾
file.write('aaa') # 此时从读取后的位置写入内容,程序执行一次后,文件内容变更为“abcdeaaa”。
上方代码中的read()方法,参数为整数,能够读取指定数量的字符,省略参数时,读取全部文件内容,并将读写指针停留在文件内容的末尾。
write()方法从读写指针所在的位置开始写入新的内容。
5、可读追加
打开文件时,指定模式为’a+’,能够在追加内容之后读取文件内容。
示例代码:
path = r'C:\Users\Administrator\Desktop\song\test.txt' # 假设当前文件内容为“abcde”。
with open(path, 'a+') as file: # 设置打开模式为读写模式。
file.write('aaa') # 在文件末尾写入内容,程序执行一次后,文件内容变更为“abcdeaaa”。
file.flush() # 刷新缓存,将缓存内容立即写入文件。
file.seek(0) # 移动文件读取指针到指定位置,0为文件开始位置。
print(file.read()) # 显示输出结果为:abcdeaaa
注意:在文件操作过程中(文件未关闭),写入的内容并未真正的写入到文件,而是保存在缓存中;所以,需要使用flush()方法刷新缓存,将文件更新,才能够读取到文件内容。
在上方代码中,除了刷新缓存的函数,还有seek()方法,用于将读写指针移动到指定的位置。
这里将读写指针移动回文件开始位置(因为写入内容后停留在末尾的位置),从头进行读取。
6、可读写入
打开文件时,指定模式为’w+’,能够在写入文件内容之后读取文件内容。
示例代码:
path = r'C:\Users\Administrator\Desktop\song\test.txt' # 假设当前文件内容为“abcde”。
with open(path, 'w+') as file: # 打开并清空文件
file.write('aaa') # 写入内容,程序执行后,文件内容变更为“aaa”。
file.flush()
file.seek(0)
print(file.read()) # 显示输出结果为:aaa
接下来,我们一起来看一下fileinput模块包含的内容。
示例代码:
import fileinput
print(fileinput.__all__)
通过模块的__all__特性,我们得到以下结果:
[‘input’, ‘close’, ‘nextfile’, ‘filename’, ‘lineno’, ‘filelineno’, ‘fileno’, ‘isfirstline’, ‘isstdin’, ‘FileInput’, ‘hook_compressed’, ‘hook_encoded’]
input():获取包含多个文件的可迭代对象
filename():获取当前读取文件的名称
fileno():获取文件编号
lineno():获取当前已经读取总行数
filelineno():获取当前读取的行的行号
isfirstline():检查是否当前所读取文件的第一行
isstdin():检查是否从标准输入中读取的行
nextfile():读取下一个文件
close():关闭读取的文件对象
hook_compressed:用于读写.gz .bz2 文件
hook_encoded(encoding):用于处理文件编码
读取文件往往不是简单的读取与写入,fileinput模块提供的功能,能够让我们更灵活的进行文件读取。
下面这个例子,是对某一文件夹中的全部文件进行读取,并显示输出读取结果。
通过这个例子,大家可以对fileinput模块中的常用方法进行了解。
示例代码:
import os, fileinput # 导入需要使用的模块
path = r'C:\Users\Administrator\Desktop\song' + '\\' # 设置查询的目标文件夹路径
names = os.listdir(path) # 获取到目标文件夹下所有的文件名称
paths = [] # 创建路径列表
for name in names: # 循环遍历所有的文件名称
paths.append(path + name) # 为路径列表添加文件路径
files = fileinput.input(paths) # 获取目标文件夹中所有文件
for line in files: # 遍历所有文件
all_no = fileinput.lineno() # 获取当前已被读取的总行数
line_no = fileinput.filelineno() # 获取当前文件被读取行的行号
if line_no == 10: # 如果当前文件读取到第10行
fileinput.nextfile() # 读取下一个文件
if fileinput.isfirstline(): # 检查是否第一行
print(fileinput.filename()) # 显示输出当前读取的文件名称
if all_no >= 15: # 如果已被读取的总行数达到15行
fileinput.close() # 关闭当前读取的文件
print(all_no, line_no, line.replace('\n', '')) # 显示输出已读取的总行数、当前文件被读取行的行号和当前读取的行内容
代码运行结果:
在fileinput模块中,input()函数是最重要的函数,它有很多参数。
fileinput.input(files=None, inplace=False, backup=”, bufsize=0, mode=’r’, openhook=None)
files:文件或文件列表
inplace:指定是否将标准输出结果写入文件,默认为False(不写入)。
backup:指定备份文件的扩展名,默认为空值(不备份)。
bufsize:指定缓冲区大小,默认为0(不缓冲)。
mode:指定读写模式,默认为’r’(只读)。
openhook:控制打开的全部文件,例如编码类型,默认为None。