日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python open ascii codec cant_解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误...

發布時間:2025/4/16 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python open ascii codec cant_解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天準備將某SQLite數據庫的內容導出到文本文檔(*.txt)中,設計的Python程序如下:

# -*- coding: UTF-8 -*-

import sqlite3

def gsel(cur):

cur.execute("SELECT * FROM collection")

def main():

conn = sqlite3.connect("build.db3")

cur = conn.cursor()

gsel(cur)

# conn.commit()

rs = cur.fetchall()

fp = open("output.txt", "w")

for row in rs:

fp.write(row[1]) # 讀取并寫入第2列數據

if __name__ == '__main__':

main()

# -*- coding: UTF-8 -*-

import sqlite3 def gsel(cur):

cur.execute("SELECT * FROM collection")

def main():

conn = sqlite3.connect("build.db3")

cur = conn.cursor()

gsel(cur)

# conn.commit()

rs = cur.fetchall()

fp = open("output.txt", "w")

for row in rs:

fp.write(row[1]) # 讀取并寫入第2列數據 if __name__ == '__main__':

main()

代碼上面應該沒有什么問題,Python使用的是版本2.7,但是在運行的時候出現了異常錯誤UnicodeEncodeError:

Traceback (most recent call last):

File "makedb.py", line 33, in main()

File "makedb.py", line 30, in main

fp.write(row[1])

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-78: ordinal not in range(128)

本來以為數據讀取錯誤,我特將fp.write改成print,結果數據全部讀取并顯示在命令控制臺上了,證明代碼是沒有問題的,仔細看了下異常信息,貌似是因為編碼問題:Unicode編碼與ASCII編碼的不兼容,其實這個Python腳本文件是由utf-8編碼的,同時SQlite3數據庫存取的也是UTF-8格式,Python默認環境編碼通過下面的方法可以獲取:

import sys

print sys.getdefaultencoding()

# 'ascii'

import sys

print sys.getdefaultencoding()

# 'ascii'

基本上是ascii編碼方式,由此Python自然調用ascii編碼解碼程序去處理字符流,當字符流不屬于ascii范圍內,就會拋出異常(ordinal not in range(128))。

解決的方案很簡單,修改默認的編碼模式,很多朋友會想到setdefaultencoding,是的,我們可以通過sys.setdefaultencoding(‘utf-8’)來將當前的字符處理模式修改為utf-8編碼模式,值得注意的是,如果單純這么調用的話,Python會拋出一個AttributeError異常:

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'module' object has no attribute 'setdefaultencoding'

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'module' object has no attribute 'setdefaultencoding'

竟然說sys沒有setdefaultencoding的方法,其實sys是有這個方法的,但是要請出她老人家需要調用一次reload(sys),很奇怪,是么?如果有誰知道原因的話,還望不吝賜教。

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

好了,通過上面短短的三行,我們算是很好的解決了這個問題了,同樣的方式也可以應用到UnicodeDecodeError上。當然這個技巧來自于網絡,我還找到其他特別的辦法,但是感覺還是這個比較靠譜,有童鞋說:我們將Python 2.x系列升級到Python 3.x系列就可以了,小小的問題犯不著升級吧,畢竟2到3還是要有個過渡的。

最后,我將文章一開始的代碼更改如下:

# -*- coding: UTF-8 -*-

import sys # 1

import sqlite3

def gsel(cur):

cur.execute("SELECT * FROM collection")

def main():

reload(sys) # 2

sys.setdefaultencoding('utf-8') # 3

conn = sqlite3.connect("build.db3")

cur = conn.cursor()

gsel(cur)

# conn.commit()

rs = cur.fetchall()

fp = open("output.txt", "w")

for row in rs:

fp.write(row[1])

if __name__ == '__main__':

main()

# -*- coding: UTF-8 -*- import sys # 1

import sqlite3 def gsel(cur):

cur.execute("SELECT * FROM collection")

def main():

reload(sys) # 2

sys.setdefaultencoding('utf-8') # 3 conn = sqlite3.connect("build.db3")

cur = conn.cursor()

gsel(cur)

# conn.commit()

rs = cur.fetchall()

fp = open("output.txt", "w")

for row in rs:

fp.write(row[1])

if __name__ == '__main__':

main()

總結

以上是生活随笔為你收集整理的python open ascii codec cant_解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。