最新要闻

广告

手机

光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯

光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯

搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注

搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注

家电

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

来源:博客园

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

Python3中的open函数定义为:

open(file, mode="r", buffering=None, encoding=None, errors=None, newline=None, closefd=True)

其中mode列表为:


(资料图片仅供参考)

"r" #open for reading (default)"w" #open for writing, truncating the file first"x" #create a new file and open it for writing,python3新增"a" #open for writing, appending to the end of the file if it exists"b" #binary mode"t" #text mode (default),python3新增"+" #open a disk file for updating (reading and writing)"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;每次读写都是从游标位置开始;但是对于写操作,类似于替换操作;看如下代码:文件内容为:

abcdefg

代码内容为:

f = open("open_mode.txt", "r+")f.write("xyz")f.close()

运行代码后,文件内容变为:

xyzdefg

6."w+"

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

7."a+"

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

8."x"

python3新加创建文件并写操作,操作必须是不存在的文件,如果操作的文件已存在,则报错FileExistsError不可读,如果进行了读操作,同时报如下异常:

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"模式下这样读写字符串

s = b"hello world!" #注意是byte字符串f = open("open_mode.txt","wb")f.write(s)

或:

s = "hello world!"f= open("open_mode.txt","wb")f.write(s.encode(encoding="utf-8"))

不然会报如下错误:

Traceback (most recent call last):File"C:/Users/Desktop/Python/cnblogs/数据类型.py", line 125, in f.write(s)TypeError: a bytes-like object is required, not "str"

read文本的相关方法

准备测试数据 test.txt富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善。

python 读取文件的常用方法open()读取的方法,有read(),readline(),readlines()

1.read()

read()方法是读取整个文件,将整个文件的内容放在一个字符串变量中.这个方法的缺点就是当文件过大尤其是大于内存时,方法就失效了.

with open("test.txt", "r", encoding="UTF-8")as f:    res = f.read()    print(res)

直接输出文件里的所有内容

富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善。

2.readline()

readline()方法是每次只读取一行,并将读取的内容放在一个字符串变量中,缺点是这种方法比较慢.

with open("test.txt", "r", encoding="UTF-8")as f:    res = f.readline()    print(res)

执行的效果为

富强、民主、文明、和谐,

要想获取全部的内容,就需要自己手动循环了

#学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441with open("test.txt", "r", encoding="UTF-8")as f:    while True:        line = f.readline()        if line:            print(type(line), line)        else:            break

结果为

 富强、民主、文明、和谐, 自由、平等、公正、法治, 爱国、敬业、诚信、友善。

3.readlines()

readlines()方法一次性读取整个文件,并自动将内容分析成一个行的列表:

with open("test.txt", "r", encoding="UTF-8")as f:    res = f.readlines()    print(res)

结果为

["富强、民主、文明、和谐,\n", "自由、平等、公正、法治,\n", "爱国、敬业、诚信、友善。"]

去掉/n及分割

with open("test.txt", "r", encoding="UTF-8")as f:    res = f.read()    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)

关键词: