Python编程:Python2.7环境下的中文文件读写

举报
彭世瑜 发表于 2021/08/14 01:33:58 2021/08/14
【摘要】 测试过程比较啰嗦,可以直接看文章底部的结论 测试环境 python 2.7.5 读写的文本 # -*- coding: utf-8 -*- poetry = """ 相思 唐代:王维 红豆生南国,春来发几枝。 愿君多采撷,此物最相思。 """ 12345678 1、直接读写中文(正常) # -*- coding: utf-8 -*- # 写入(正常) f ...

测试过程比较啰嗦,可以直接看文章底部的结论

测试环境
python 2.7.5

读写的文本

# -*- coding: utf-8 -*-

poetry = """
相思
唐代:王维
红豆生南国,春来发几枝。
愿君多采撷,此物最相思。
"""

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

1、直接读写中文(正常)

# -*- coding: utf-8 -*-

# 写入(正常)
f = open("相思.txt", "w")
f.write(poetry)
f.close()

# 读取(正常)
f = open("相思.txt", "r")
print(f.read())
f.close()


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2、引入future 后读写中文(报错)

# -*- coding: utf-8 -*-

from __future__ import unicode_literals, print_function

# 写入(报错)
f = open("相思.txt", "w")
f.write(poetry)
f.close()

"""
Traceback (most recent call last):
  File "code_demo.py", line 18, in <module> f.write(poetry)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: 
ordinal not in range(128)
"""

# 读取(正常)
f = open("相思.txt", "r")
print(f.read())
f.close()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

3、引入future 后通过io读写中文(正常)

# -*- coding: utf-8 -*-

from __future__ import unicode_literals, print_function
import io

# 写入(正常)
f = io.open("相思.txt", "w")
f.write(poetry)
f.close()

# 读取(正常)
f = io.open("相思.txt", "r")
print(f.read())
f.close()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

4、使用codecs直接读写中文(正常)

# -*- coding: utf-8 -*-

import codecs

# 写入(正常) 
f = codecs.open("相思.txt", "w")
f.write(poetry)
f.close()

# 读取(正常)
f = codecs.open("相思.txt", "r")
print(f.read())
f.close()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

5、引入future 后使用codecs读写中文(报错)

# -*- coding: utf-8 -*-

from __future__ import unicode_literals, print_function
import codecs

# 写入(报错) 
f = codecs.open("相思.txt", "w")
f.write(poetry)
f.close()
"""
Traceback (most recent call last):
  File "code_demo.py", line 19, in <module> f.write(poetry)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: 
ordinal not in range(128)
"""

# 读取(正常)
f = codecs.open("相思.txt", "r")
print(f.read())
f.close()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

6、引入future 后使用codecs指定编码后读写中文(正常)

# -*- coding: utf-8 -*-

from __future__ import unicode_literals, print_function
import codecs


# 写入(正常)  需要制定编码  "utf-8"
f = codecs.open("相思.txt", "w", "utf-8")
f.write(poetry)
f.close()

# 读取(正常)
f = codecs.open("相思.txt", "r")
print(f.read())
f.close()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

总结

环境 编码 读写方式 读情况 写情况
默认 ASCII open - -
引入future unicode open - 报错
引入future unicode io.open - -
默认 ASCII codecs.open - -
引入future unicode codecs.open - 报错
引入future unicode codecs.open指定编码utf-8 - -

所以,默认编码是ASCII码,正常情况下直接读写是没有问题的,如果引入新特性future.unicode_literals之后,文件的中文编码变成了unicode,原来的不支持unicode读写的方式就会报错

在Python2.7 中,内建的 open函数是没有encoding参数的,不能指定编码,只能通过io.open 来读写unicode编码的中文,或者通过codecs.open 指定编码方式

在Python3之后,内建的 open函数添加了encoding参数,可以直接指定编码,当然Python3的默认编码已经改为了unicode,没有那么多问题

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/89455391

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。