文章目录
- 前言
- 一、文件基本操作 --- r读模式
- 二、文件基本操作 --- 读写模式r+(常用)
- 三、文件基本操作 --- 追加读模式a+(常用)
- 四、文件基本操作 --- 写读模式w+(不常用)
- 五、文件基本操作 --- 二进制格式_读模式rb(open时,不能用encoding参数)
- 六、文件基本操作 --- 二进制格式_读模式wb(open时,不能用encoding参数)
- 七、文件基本操作 --- 其他操作(常用操作)
- 八、文件基本操作 --- 其他操作(不常用操作)
-
- 1. detach()方法:文件编辑过程中,更换文件编码格式
- 2. encoding()方法:打印当前文件,编码格式
- 3. buffer()方法
- 4. errors()方法:用于异常处理
- 5. fileno():返回文件句柄在内存中的编号,调用操作系统接口获取的
- 6. name():以str类型,返回文件名称
- 7. isatty():判断当前文件是否为终端设备,如打印机等,底层开发时才会用到
- 8. seekable():判断是否可以使用seek方法
- 9. readable():判断文件是否可读
- 10. writeable():判断文件是否可写
- 11. closed():判断文件是否已关闭
- 12. readinto():可以直接将二进制数据写入到可变缓冲区中,很少使用
- 九、文件基本操作 --- with语句
- 总结
前言
首先要知道,对文件操作基本流程:
1、打开文件,得到文件句柄并赋值给一个变量
2、通过句柄对文件进行操作
3、关闭文件
文件操作方法注释等更多详情,可参考:alex大王第二周博客
打开文件的模式有:
- r,只读模式(默认)。
- w,只写模式。【不可读;不存在则创建;存在则删除内容;】
- a,追加模式。【不可读;不存在则创建;存在则只追加内容;】
- 附:mode 的值包括 ‘r’ ,表示文件只能读取;‘w’ 表示只能写入(现有同名文件会被覆盖);‘a’ 表示打开文件并追加内容,任何写入的数据会自动添加到文件末尾。‘r+’ 表示打开文件进行读写。mode 实参是可选的,省略时的默认值为 ‘r’。
- 通常,文件以 text mode 打开,即,从文件中读取或写入字符串时,都以指定编码方式进行编码。如未指定编码格式,默认值与平台相关 (参见 open())。在 mode 中追加的 ‘b’ 则以 binary mode 打开文件:此时,数据以字节对象的形式进行读写。该模式用于所有不包含文本的文件。
- 在文本模式下读取文件时,默认把平台特定的行结束符(Unix 上为 \n, Windows 上为 \r\n)转换为 \n。在文本模式下写入数据时,默认把 \n 转换回平台特定结束符。这种操作方式在后台修改文件数据对文本文件来说没有问题,但会破坏 JPEG 或 EXE 等二进制文件中的数据。注意,在读写此类文件时,一定要使用二进制模式。
“+” 表示可以同时读写某个文件
- r+,读写文件【1. 无法新建文件 2. 可读;可覆盖写;可追加写】
- w+,写读文件【1. 可以新建文件 2. 可读;可覆盖写;】
- a+,追加写文件【1. 可以新建文件 2. 可读;可追加写】
- "U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
- rU
- r+U
总结:
# lyrics.txt原文:
这天,酒店老板正在大厅巡视。
来了一乞丐上前说道:“老板给个牙签行吗?”
老板给他一个打发走了。
一会儿,又来一个乞丐,也是来要牙签的。
老板心想现在这乞丐怎么不要饭改要牙签了?
也同样给他一个打发走了,没过多旧,又来一个乞丐。
老板对他说:“你也是来要牙签的吗?”
乞丐说:“有个人吐了,可我晚了一步,已经被前面两个乞丐把能吃的都吃了,现在只剩下汤了。你能给我个吸管吗?
一、文件基本操作 — r读模式
- 文件读取规则:文件维护着类似指针一样的东西,文件打开时,指针会处于文件开始位置,文件首次读取时(首次调用read方法时),会从头开始一行一行读取,读取到哪个地方,指针就会移动到哪个地方,指针除非调用seek方法移回去,否则不会自动回到开始位置!!!
1. read()方法(只适合读小文件)
- read方法会从当前位置读取整个文件剩余内容,按照str类型,返回读取内容
- 根据文件读取规则,首次读取时,文件指针会移动到文件尾部,如果第二次读取前没有使用seek方法移动文件指针,则第二次读取内容为""
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Mason
if __name__ == '__main__':
f = open(file=r'D:\Codes\s14_python3\file_operation_learning\lyrics.txt',
mode="r",
encoding="utf-8")
first_read = f.read()
print("-----first_read-----%s, %s" % (type(first_read), first_read))
second_read = f.read()
print("-----second_read-----%s, >>>%s<<<" % (type(second_read), second_read))
f.close() # 关闭文件
# 输出:
-----first_read-----<class 'str'>, 这天,酒店老板正在大厅巡视。
来了一乞丐上前说道:“老板给个牙签行吗?”
老板给他一个打发走了。
一会儿,又来一个乞丐,也是来要牙签的。
老板心想现在这乞丐怎么不要饭改要牙签了?
也同样给他一个打发走了,没过多旧,又来一个乞丐。
老板对他说:“你也是来要牙签的吗?”
乞丐说:“有个人吐了,可我晚了一步,已经被前面两个乞丐把能吃的都吃了,现在只剩下汤了。你能给我个吸管吗?
-----second_read-----<class 'str'>, >>><<<
2. readline()方法
- 每次只读一行,并以str类型返回
- 根据文件读取规则,首次读取时,文件指针会移动到第二行首,第二次读取前如果没有使用seek方法移动文件指针,第二次使用readline方法读取内容为第二行内容
- 如果想要读取多行,可以使用循环
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Mason
if __name__ == '__main__':
f = open(file=r'D:\Codes\s14_python3\file_operation_learning\lyrics.txt',
mode="r",
encoding="utf-8")
first_line = f.readline()
print(type(first_line), first_line)
second_line = f.readline()
print(type(second_line), second_line)
f.close() # 关闭文件
# 输出:
<class 'str'> 这天,酒店老板正在大厅巡视。
<class 'str'> 来了一乞丐上前说道:“老板给个牙签行吗?”
3. readlines()方法(只适合读小文件)
- 将文件内容全部读出,并以list方式返回
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Mason
if __name__ == '__main__':
# 打开文件
f = open(file=r'D:\Codes\s14_python3\file_operation_learning\lyrics.txt',
mode="r",
encoding="utf-8")
# 读取文件
lines = f.readlines()
print(type(lines), lines)
# 关闭文件
f.close()
# 输出:
<class 'list'> ['这天,酒店老板正在大厅巡视。\n', '来了一乞丐上前说道:“老板给个牙签行吗?”\n', '老板给他一个打发走了。\n', '一会儿,又来一个乞丐,也是来要牙签的。\n', '老板心想现在这乞丐怎么不要饭改要牙签了?\n', '也同样给他一个打发走了,没过多旧,又来一个乞丐。\n', '老板对他说:“你也是来要牙签的吗?”\n', '乞丐说:“有个人吐了,可我晚了一步,已经被前面两个乞丐把能吃的都吃了,现在只剩下汤了。你能给我个吸管吗?']
4. 读文件方法, 内存消耗对比(重要!)
- 大文件时, 推荐使用for line in f方法,此时f为迭代器,读取文件,将文件内容一行一行全部读出到内存,且仅内存中,仅保存一行,大文件时,内存消耗也不大,效率高
- 读取文件,内存消耗对比,更多详情,可参考:https://www.cnblogs.com/happenlee/p/9528136.html
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Mason
if __name__ == '__main__':
# 打开文件
f = open(file=r'D:\Codes\s14_python3\file_operation_learning\lyrics.txt',
mode="r",
encoding="utf-8")
# 读取文件, 将文件内容全部读出到内存, 大文件时, 内存消耗大
for line in f.readlines():
print(type(line), line.strip())
print("分隔符".center(50, "-"))
# 大文件时, 推荐使用
# 读取文件, 将文件内容一行一行全部读出到内存, 且仅内存中, 仅保存一行,