这一篇教程,我们一起来了解对文件的一些操作。
三、fileinput模块
在接触新的模块之前,我们先来尝试通过Python内置的函数open进行文件的读写。
1、文件的读取
提示:open()函数的具体说明参考《Python3萌新入门笔记(16)》。
示例代码:
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。
本节知识点:
1、使用内置函数open()读写文件。
2、fileinput模块
本节英文单词与中文释义:
1、no(No.):编号
2、hook:钩子
3、compressed:压缩
4、bak(back-up):备份
5、line:线/行列
6、read:读取
7、write:写入
8、song:歌曲
9、lyric:歌词
10、inplace:原地
11、buf(buffer):缓冲
12、encoded:编码
13、flush:冲掉
14、seek:寻找
15、first:第一个
转载请注明:魔力Python » Python3萌新入门笔记(38)