最新消息:欢迎光临 魔力 • Python!大家可以点开导航菜单中的【学习目录】,这个目录类似图书目录,更加方便学习!

Python3萌新入门笔记(38)

Python教程 小楼一夜听春语 2350浏览 0评论

这一篇教程,我们一起来了解对文件的一些操作。

三、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)

头像
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网站 (可选)

网友最新评论 (1)

  1. 头像
    已阅已了解 😎
    走路爱走神3年前 (2018-05-29)回复