翼度科技»论坛 编程开发 python 查看内容

Python中对open读取文件内容时的mode模式解析

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
1.Python可以使用open函数来实现文件的打开,关闭,读写操作;

Python3中的open函数定义为:
  1. open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
复制代码
其中mode列表为:
  1. 'r' #open for reading (default)
  2. 'w' #open for writing, truncating the file first
  3. 'x' #create a new file and open it for writing,python3新增
  4. 'a' #open for writing, appending to the end of the file if it exists
  5. 'b' #binary mode
  6. 't' #text mode (default),python3新增
  7. '+' #open a disk file for updating (reading and writing)
  8. 'U' #universal newline mode (deprecated)
复制代码
这里我们主要关心一下'r', 'w', 'a', 'r+', 'w+', 'a+', 'x',很多人容易混淆不同模式的读写操作
2.'r'

只读模式,open函数中mode参数的默认模式,文件不存在的话,报FileNotFoundError(python2是IOError);
文件打开后,初始游标位置为0;
每次读都是从游标位置开始读;
如果进行了写操作,会报如下异常:
io.UnsupportedOperation: not writable
3.'w'

只写模式,文件不存在的话,创建文件;文件存在的话,首先清空文件,然后开始写;
文件打开后,初始游标位置为0;
每次写都是从游标位置开始写;
如果进行了读操作,首先文件也会被清空,会报如下异常:
io.UnsupportedOperation: not readable
4.'a'

追加模式,文件不存在话,创建文件;文件存在的话,不会清空文件;
文件打开后,初始游标位置为文件结尾;
每次写都是从结尾开始写;
如果进行了读操作,同时报如下异常:
io.UnsupportedOperation: not readable
上面的比较好理解,下面就有点绕了
5.'r+'

读写模式,文件不存在的话,报FileNotFoundError(python2是IOError);
文件打开后,初始游标位置为0;
每次读写都是从游标位置开始;但是对于写操作,类似于替换操作;
看如下代码:
文件内容为:
  1. abcdefg
复制代码
代码内容为:
  1. f = open('open_mode.txt', 'r+')
  2. f.write('xyz')
  3. f.close()
复制代码
运行代码后,文件内容变为:
  1. xyzdefg
复制代码
6.'w+'

只写模式,文件不存在的话,创建文件;文件存在的话,首先清空文件;
文件打开后,初始游标位置为0;
每次读写都是从游标位置开始;写操作,类似于替换操作;
7.'a+'

追加模式,文件不存在话,创建文件;文件存在的话,不会清空文件;
文件打开后,初始游标位置为文件结尾;
每次写都是从结尾开始写;
读操作从游标位置开始;
8.'x'

python3新加
创建文件并写操作,操作必须是不存在的文件,如果操作的文件已存在,则报错FileExistsError
不可读,如果进行了读操作,同时报如下异常:
  1. io.UnsupportedOperation: not readable
复制代码
9.'b'

二进制形式读写文件;
写数据时,写入的数据类型必须为字符串类型,其他类型必须通过json(就是符合json格式的字符串)写入
python2与python3对于'b’ mode的行为不同,这和python2与python3的字符串类型有关;事实上,python的字符串类型有两种;
Python2的两种字符串类型,分别叫做str和Unicode,str实例包含原始的8位值;而unicode的实例,则包含Unicode字符。
Python2的两种字符串类型,分别叫做byte和str,与python2不同的是,byte实例包含原始的8位值;而str的实例,则包含Unicode字符。
当读写文件采用'b'的模式时,要求必须以二进制形式读写,在python2中,字符串必须为str字符串,python3中必须为byte字符串;所以在python3,'b'模式下这样读写字符串
  1. s = b'hello world!' #注意是byte字符串
  2. f = open('open_mode.txt','wb')
  3. f.write(s)
复制代码
或:
  1. s = 'hello world!'f= open('open_mode.txt','wb')
  2. f.write(s.encode(encoding='utf-8'))
复制代码
不然会报如下错误:
  1. Traceback (most recent call last):
  2. File"C:/Users/Desktop/Python/cnblogs/数据类型.py", line 125, in f.write(s)
  3. TypeError: a bytes-like object is required, not 'str'
复制代码
read文本的相关方法
  1. 准备测试数据 test.txt
  2. 富强、民主、文明、和谐,
  3. 自由、平等、公正、法治,
  4. 爱国、敬业、诚信、友善。
复制代码
python 读取文件的常用方法open()
读取的方法,有read(),readline(),readlines()
1.read()

read()方法是读取整个文件,将整个文件的内容放在一个字符串变量中.
这个方法的缺点就是当文件过大尤其是大于内存时,方法就失效了.
  1. with open("test.txt", "r", encoding='UTF-8')as f:
  2.     res = f.read()
  3.     print(res)
复制代码
直接输出文件里的所有内容
  1. 富强、民主、文明、和谐,
  2. 自由、平等、公正、法治,
  3. 爱国、敬业、诚信、友善。
复制代码
2.readline()

readline()方法是每次只读取一行,并将读取的内容放在一个字符串变量中,缺点是这种方法比较慢.
  1. with open("test.txt", "r", encoding='UTF-8')as f:
  2.     res = f.readline()
  3.     print(res)
复制代码
执行的效果为
  1. 富强、民主、文明、和谐,
复制代码
要想获取全部的内容,就需要自己手动循环了
  1. #学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
  2. with open("test.txt", "r", encoding='UTF-8')as f:
  3.     while True:
  4.         line = f.readline()
  5.         if line:
  6.             print(type(line), line)
  7.         else:
  8.             break
复制代码
结果为
  1. <class 'str'> 富强、民主、文明、和谐,
  2. <class 'str'> 自由、平等、公正、法治,
  3. <class 'str'> 爱国、敬业、诚信、友善。
复制代码
3.readlines()

readlines()方法一次性读取整个文件,并自动将内容分析成一个行的列表:
  1. with open("test.txt", "r", encoding='UTF-8')as f:
  2.     res = f.readlines()
  3.     print(res)
复制代码
结果为
  1. ['富强、民主、文明、和谐,\n', '自由、平等、公正、法治,\n', '爱国、敬业、诚信、友善。']
复制代码
去掉/n及分割
  1. with open("test.txt", "r", encoding='UTF-8')as f:
  2.     res = f.read()
  3.     print(res)    list = res.replace('\n', ',').split(',')    print(list)# 循环lineswith open("test.txt", "r", encoding='UTF-8')as f:    lines = f.readlines()    for line in lines:        print(line)
复制代码
来源:https://www.cnblogs.com/xxpythonxx/p/17526045.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具