看题:请指出下面代码段中的错误
f = open("test.txt", mode="w")
f.write(u"python之禅") 分析:Python 提供了内建函数 open 用于读写文件,函数返回一个文件对象,可对文件进行读、写操作,用参数 mode 来控制。
参数 说明
r 读文件(默认) w 写文件 (如果文件中有内容,已有的内容将被覆盖) a 写文件(如果文件中有内容,新内容追后到文件后面) 默认是读文件f = open("test.txt")
f.read() python之禅 上面这段代码如果在python2中运行,会报错:
Traceback (most recent call last):
File ““, line 1, in UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 6-7: ordinal not in range(128)这是一个字符编码的问题,编码错误是Python程序员最经常遇到的错误,之前在公众号中写过关于编码错误的原因。
之所以报错是程序没法直接保存 unicode 字符串,要经过编码转换成而 str 类型的二进制字节序列才能够保存。
write 方法会自动帮你做编码转换,默认使用 ascii 编码格式,因为 ascii 字符集不能处理中文,所以出现了 UnicodeEncodeError 错误。
正确的方式是在调用 write 之前手动用 utf-8 或者 gbk 编码转换成 str 类型。
f = open("test.txt", mode="w")
content = u"Python之禅" content = content.encode(encoding='utf-8') f.write(content) 第二个问题是文件对象没有正常关闭,有人可能要问了,不关闭会有什么影响,操作完文件时,如果不关闭文件,那么将对系统造成资源浪费,因为系统可打开的文件描述符数量是有限制,比如 Linux 是 65536,所以必须要关闭文件。
f = open("test.txt", mode="w")
content = u"Python之禅" content = content.encode(encoding='utf-8') f.write(content) f.close() close 就万事大吉了吗?未必。
因为有可能在调用 open 函数的时候就报错了,比如因为权限问题没法在该目录读写文件,此时,文件对象都没创建成功,调用close肯定会报错。
再比如在第4行 write 的时候有可能报错,因为磁盘空间不足,这个时候报错了, close 方法就没有机会执行了。
正确地做法是用 try except 对异常进行捕获。注意,open 函数要在 try 代码块外面
f = open("output.txt", "w") try: content = u"Python之禅" f.write(content.encode(encoding='utf-8')) except IOError as e: print("oops, %s" % e.args[0]) finally: f.close()
with open("output.txt", "w") as f: content = u"Python之禅"
python3
with open("output.txt", "w", encoding="utf-8") as f: content = u"Python之禅" f.write(content)
没错,使用 io 模块下的 open 函数,python2 中的 io.open 等价于 python3 中的 open 函数,可以指定 encoding 参数,同时 python3 也保留有 io.open 函数
from io import open with open("output.txt", "w", encoding='utf-8') as f: f.write(u"python之禅")