open() 文件操作的几种方式

r 以读的方式打开
w 以写方式打开
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
a+ 以读写模式打开 (参见 a )
rb:读取二进制文件,例如图片文件
wb:写入二进制数据,例如保存图片的时候会用到
ab:追加二进制数据
rb+:二进制的读写模式,即可以读文件,又可以向文件写入内容
wb+:同上
ab+:同上

2. r+:

在解释器里执行下列语句:首先把工作路径切换到txt文本所在目录,然后打开txt文本

os.chdir('/your/path/')
txt = open('t.txt', 'r+')
txt.write('hhh')
txt.close()

执行结果是:
https://www.tangkin.com/tangkin_admin/write-post.php?cid=61###

可以看到写入的'hhh'把原来文本中的'AnB'这三个字符给覆盖了,写入位置是文本起始处
2-1.png
但是如果进行了读操作,写入就会在文本后面追加,而不是从头覆盖原始内容了,见下图:

txt = open('t.txt', 'r+')
txt.readline()
txt.write('hhh')
txt.close()

执行结果为:
2-2.png

3. w+

w+是打开文件后清空原始内容,对清空后的文本可执行读写操作,读操作需要通过seek()方法将读取指针从末尾移动到前面,才能读取内容(w模式是不能读取的),写操作则是一直追加在文本末尾

txt = open('t.txt', 'w+')
txt.readline()
txt.write('E\nF\nG\nH')
txt.readline()
txt.seek(0, 0)
txt.readline()
txt.readline()
txt.close()

执行结果是:
3.png

4. a+

a+是追加文本在文档末尾,不会覆盖原来的内容,读取时也需要通过seek()方法移动读取指针到文档开头,否则指针在最后面是读取不到内容的。

txt = open('t.txt', 'a+')
txt.readline()
txt.seek(0, 0)
txt.readline()
txt.write('\nE')
txt.close()

执行结果:
4.png

5. 小结

a+和r+的区别在于。r+如果不进行读操作,会从文档起始位置开始写入,并会覆盖原始文本;a+永远是追加在文本在文档最后面。w+则会清空原始文本,清空后就跟a+的行为相同了。a+和w+在打开文件不存在的情况下能创建新文档,而r+则报错。

open()的5个方法

open函数返回一个文件对象,这个对象有下面5个方法可以使用:
1.file.read() 读取文件
2.file.readline() #读取单独的一行,知道一个换行符出现,也读取这个换行符
3.file.readlines() #读取文件中的所有行,并将其作为列表返回
4.file.write() #往文件中写入一些内容
5.file.close() #关闭这个文件

编码出错问题记录

经历的项目中,因为需要支持多语语言系统的关系。特别的对python3中的编码内容进行了深入的了解。
同时也遇到了一些问题,在这里做一下记录。

1.关于python print的输出编码问题:

在非中文系统环境的系统中python的输出print stdout都会发生编码的错误。
一般会显示报错:
File "D:objWindows-Release37win32_Releasemsi_pythonzip_win32cp1252.py", line 19,
in encode
UnicodeEncodeError: 'charmap' codec can't encode character 'uff0c' in position 13: character maps to <undefined>

解决方法一:

print("中文字符") 改写成 print("中文字符".encode("utf-8"))

解决方法二:

一次性修改声明修改的:
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #set sys def-encode utf8

解决方法三:

如果你希望你的py程序用户群更广泛,建议以英文字符做为注释及输出的主要字符,这样适用性更广,同时也能熟悉英语。
毕竟计算机编码中最通用的ASCII编码,所有英文、数字、符号都包含在内。

附:一些中文的编码:uff0c=,

文章目录