我是pymysql模块的新手并试图发现它,我有一个简单的代码:
import pymysql
conn=pymysql.connect(host="127.0.0.1",
port=8080,user="root",
passwd="mysql",
db="world",
charset="utf8",
use_unicode=True)
cur=conn.cursor()
cur.execute("SELECT * FROM world.city")
for line in cur:
print(line)
cur.close()
conn.close()
我正在使用Visual Studio的Python工具。当我执行代码时,它失败并出现此错误:
Traceback (most recent call last):
File "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensio
ns\Microsoft\Python Tools for Visual Studio\1.5\visualstudio_py_debugger.py", li
ne 1788, in write
self.old_out.write(value)
File "C:\Python32\lib\encodings\cp437.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 6-7: cha
racter maps to <undefined>
失败行包含城市名称:´s-Hertogenbosch
我认为这可能是cmd输出的一个相关问题,所以我切换到python shell,我的脚本运行没有任何错误。
那我面临的问题是什么? 我该如何解决?
我真的想在Visual Studio中使用Python工具,所以我最喜欢使用PTVS的答案。
答案 0 :(得分:3)
我的猜测是你收到的数据不是unicode,尽管你的python脚本试图用Unicode编码它。
我会检查数据库和表格特定字符集&amp;整理设置。 utf8&amp; utf8_general_ci是你的朋友。
答案 1 :(得分:1)
问题可能是环境的输出编码设置为cp437,并且在执行可能转换为print(line)
的{{1}}时无法将unicode字符转换为该编码。
尝试通过写入文件替换循环内的self.old_out.write(value)
,如:
print()
好吧,但是光标不会返回字符串行。它返回一行(我猜元组)的元素。因此你可能需要做类似的事情:
with open('myoutput.txt', 'w', encoding='utf-8') as f:
for line in cur:
f.write(line)
这可能足以用于诊断目的。如果你需要一些更好的字符串,你必须以某种特定的方式格式化它。
另外,你写道:
with open('myoutput.txt', 'w', encoding='utf-8') as f:
for row in cur:
f.write(repr(row))
如果使用 charset="utf8",
use_unicode=True)
,则可以省略charset
(使用use_unicode=True
暗示。如果我没记错,charset
不是已识别的Python编码。您必须使用charset='utf8'
- 即charset='utf-8'
和utf
之间的短划线或下划线。更正: 8
可能因为它是别名之一。
更新 ...
由于对文件的输出似乎没问题,因此问题与用于输出utf8
命令的窗口的功能有关。由于print
只知道cp437,你必须使用或另一个窗口(如某些GUI的支持Unicode的窗口),或者你必须告诉cmd
使用另一种编码。请参阅experience of others。基本上,你必须告诉控制台:
cmd
将接受的输出编码更改为UTF-8,或者您可以使用支持所需字符的其他(非Unicode)编码。此外,控制台字体应该能够显示字符(即包含字形,字符的图像)。