天天看點

Python程式設計:Python2.7環境下的中文檔案讀寫總結

測試過程比較啰嗦,可以直接看文章底部的結論

測試環境

python

2.7.5

讀寫的文本

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

poetry = """
相思
唐代:王維
紅豆生南國,春來發幾枝。
願君多采撷,此物最相思。
"""      

1、直接讀寫中文(正常)

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

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

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

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()      

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()      

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()      

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()      

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()      

總結

環境 編碼 讀寫方式 讀情況 寫情況
預設 ASCII open -
引入future unicode 報錯
io.open
codecs.open
codecs.open指定編碼utf-8

是以,預設編碼是ASCII碼,正常情況下直接讀寫是沒有問題的,如果引入新特性future.unicode_literals之後,檔案的中文編碼變成了unicode,原來的不支援unicode讀寫的方式就會報錯

在Python2.7 中,内建的 open函數是沒有encoding參數的,不能指定編碼,隻能通過io.open 來讀寫unicode編碼的中文,或者通過codecs.open 指定編碼方式

在Python3之後,内建的 open函數添加了encoding參數,可以直接指定編碼,當然Python3的預設編碼已經改為了unicode,沒有那麼多問題