1.python发送邮件,网页接收正常,Foxmail附件乱码
应该是编码的问题……说不定发送英文或者数字的能够正常呢?
好吧,其实我也不太清楚
不过我关注的不是这个,而是放在文件夹下的方法太蛋疼了。
弄个拖动的吧,这样就可以放在%userprofile%\AppData\Roaming\Microsoft\Windows\SendTo文件夹下,直接“发送到”了,getfile用于接收文件路径。
try:
#得到拖动的文件路径
getfile = sys.argv[1]except Exception, e:
#用正常方式打开
getfile = raw_input('输入完整路径获取附件(拖动文件到控制台窗口):')filename = os.path.basename(getfile) #从路径获取文件名
对了,别忘记把.py后缀改成.pyw,消除黑色窗口……
还有弄个
import ctypes#……#结束后弹出提示对话框text = filename + '\n' + 'Successfully sent to ' + msg['to']ctypes.windll.user32.MessageBoxA(0, text, '', 0)#……
来吧,可劲地折腾吧。
2.python显示乱码
多次被python的编码/乱码问题困扰,相信pythoner们都被困扰过,网上铺天盖地的资料太多也参差不齐,就整理了下。
本文从使用的角度系统总结了python编码相关的一些概念,将本文的例子玩一遍,基本上对python的编码问题就清楚了。首先明确几个概念:字节流:以utf8/gbk等编码编码的字节流。
unicode对象:python代码中,a=u'中国', 或者a='中国'.decode()的结果。terminal用于显示字符的编码:将一个用utf8/gbk编码的字节流通过terminal指定的编码,去查找对应的字符显示出来。
locale:linux下,Locale 是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为: 语言[_地域[.字符集]]. 所以说呢,locale总是和一定的字符集相联系的。
比如:zh_CN.GB2312编码转换原则:unicode是”中介”,任何编码之间转换都需要先decode()到unicode。针对python,先把结论放在前面,三点:#coding:utf-8 #.py文件是什么编码就需要告诉python用什么编码去读取这个.py文件。
sys.stdout.encoding,默认就是locale的编码,print会用sys.stdout.encoding去encode()成字节流,交给terminal显示。所以locale需要与terminal一致,才能正确print打印出中文。
sys.setdefaultencoding('utf8'),用于指定str.encode() str.decode()的默认编码,默认是ascii。对编码字符串a,代码中可以直接写a.encode(“gbk”),但事实上内部自动先通过defaultencoding 去decode成unicode之后再encode()的。
str(xxx)应该也是用这个去编码的。'ascii' codec can't encode characters in position 7-8: ordinal not in range(128)print的时候出现这个错误一般可以使用这个方案去处理。
为了避免代码中到处都要去encode(“xxx”),还有可能不同的地方写得不一样带来不一致的情况,推荐使用这个:import sysreload(sys)sys.setdefaultencoding('utf8')例子1:在python中,unicode vs 字节流:字节流可以从unicode encode得到,unicode可以从utf8/gbk等编码的字节流decode得到。分析下面这段代码,终端/locale分别为不同编码的情况:#coding:utf-8 #由于.py文件是utf-8的,所以必须有这一句import sysimport localeimport osimport codecsreload(sys)print sys.getdefaultencoding() + " - sys.getdefaultencoding()"sys.setdefaultencoding('utf8') #影响encode()print sys.getdefaultencoding() + " - sys.getdefaultencoding()"print sys.stdout.encoding + " - sys.stdout.encoding:"#sys.stdout = codecs.getwriter('utf8')(sys.stdout) #影响printprint sys.stdout.encoding + " - sys.stdout.encoding:"u = u'中国'print u + " - u"a = '中国'print a + " - a"print a.decode('utf-8') + " - a.decode('utf-8')"print a.decode('utf-8').encode('gbk') + " - a.decode('utf-8').encode('gbk')"print a.decode('utf-8').encode('utf-8') + " - a.decode('utf-8').encode('utf-8')"print a.decode('utf-8').encode() + " - a.decode('utf-8').encode()"print (sys.stdout.encoding) + " - (sys.stdout.encoding)"print (sys.stdout.isatty())print (locale.getpreferredencoding())print (sys.getfilesystemencoding())—终端为UTF-8,locale为zh_CN.GBK—————–ascii - sys.getdefaultencoding()utf8 - sys.getdefaultencoding()GBK - sys.stdout.encoding:GBK - sys.stdout.encoding:?й? - u中国 - a?й? - a.decode('utf-8')?й? - a.decode('utf-8').encode('gbk')中国 - a.decode('utf-8').encode('utf-8')中国 - a.decode('utf-8').encode()GBK - (sys.stdout.encoding)TrueGBKutf-8—终端为UTF-8,locale为zh_CN.UTF-8—————–ascii - sys.getdefaultencoding()utf8 - sys.getdefaultencoding()UTF-8 - sys.stdout.encoding:UTF-8 - sys.stdout.encoding:中国 - u中国 - a中国 - a.decode('utf-8')?й? - a.decode('utf-8').encode('gbk')中国 - a.decode('utf-8').encode('utf-8')中国 - a.decode('utf-8').encode()UTF-8 - (sys.stdout.encoding)TrueUTF-8utf-8—终端为GBK,locale为zh_CN.GBK—————–ascii - sys.getdefaultencoding()utf8 - sys.getdefaultencoding()GBK - sys.stdout.encoding:GBK - sys.stdout.encoding:中国 - u涓???? - a中国 - a.decode('utf-8')中国 - a.decode('utf-8').encode('gbk')涓???? - a.decode('utf-8').encode('utf-8')涓???? - a.decode('utf-8').encode()GBK - (sys.stdout.encoding)TrueGBKutf-8—终端为GBK,locale为zh_CN.UTF-8—————–ascii - sys.getdefaultencoding()utf8 - sys.getdefaultencoding()UTF-8 - sys.stdout.encoding:UTF-8 - sys.stdout.encoding:涓???? - u涓???? - a涓???? - a.decode('utf-8')中国 - a.decode('utf-8').encode('gbk')涓???? - a.decode('utf-8').encode('utf-8')涓???? - a.decode('utf-8').encode()UTF-8 - (sys.stdout.encoding)TrueUTF-8utf-8例子1总结,对print而言:unicode的数据如。
3.python显示乱码
多次被python的编码/乱码问题困扰,相信pythoner们都被困扰过,网上铺天盖地的资料太多也参差不齐,就整理了下。
本文从使用的角度系统总结了python编码相关的一些概念,将本文的例子玩一遍,基本上对python的编码问题就清楚了。首先明确几个概念:字节流:以utf8/gbk等编码编码的字节流。
unicode对象:python代码中,a=u'中国', 或者a='中国'.decode()的结果。terminal用于显示字符的编码:将一个用utf8/gbk编码的字节流通过terminal指定的编码,去查找对应的字符显示出来。
locale:linux下,Locale 是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为: 语言[_地域[.字符集]]. 所以说呢,locale总是和一定的字符集相联系的。
比如:zh_CN.GB2312 编码转换原则:unicode是”中介”,任何编码之间转换都需要先decode()到unicode。针对python,先把结论放在前面,三点:#coding:utf-8 #.py文件是什么编码就需要告诉python用什么编码去读取这个.py文件。
sys.stdout.encoding,默认就是locale的编码,print会用sys.stdout.encoding去encode()成字节流,交给terminal显示。所以locale需要与terminal一致,才能正确print打印出中文。
sys.setdefaultencoding('utf8'),用于指定str.encode() str.decode()的默认编码,默认是ascii。对编码字符串a,代码中可以直接写a.encode(“gbk”),但事实上内部自动先通过defaultencoding 去decode成unicode之后再encode()的。
str(xxx)应该也是用这个去编码的。'ascii' codec can't encode characters in position 7-8: ordinal not in range(128)print的时候出现这个错误一般可以使用这个方案去处理。
为了避免代码中到处都要去encode(“xxx”),还有可能不同的地方写得不一样带来不一致的情况,推荐使用这个:import sys reload(sys) sys.setdefaultencoding('utf8') 例子1:在python中,unicode vs 字节流:字节流可以从unicode encode得到,unicode可以从utf8/gbk等编码的字节流decode得到。分析下面这段代码,终端/locale分别为不同编码的情况:#coding:utf-8 #由于.py文件是utf-8的,所以必须有这一句 import sys import locale import os import codecs reload(sys) print sys.getdefaultencoding() + " - sys.getdefaultencoding()" sys.setdefaultencoding('utf8') #影响encode() print sys.getdefaultencoding() + " - sys.getdefaultencoding()" print sys.stdout.encoding + " - sys.stdout.encoding:"#sys.stdout = codecs.getwriter('utf8')(sys.stdout) #影响print print sys.stdout.encoding + " - sys.stdout.encoding:" u = u'中国' print u + " - u" a = '中国' print a + " - a" print a.decode('utf-8') + " - a.decode('utf-8')" print a.decode('utf-8').encode('gbk') + " - a.decode('utf-8').encode('gbk')" print a.decode('utf-8').encode('utf-8') + " - a.decode('utf-8').encode('utf-8')" print a.decode('utf-8').encode() + " - a.decode('utf-8').encode()" print (sys.stdout.encoding) + " - (sys.stdout.encoding)" print (sys.stdout.isatty()) print (locale.getpreferredencoding()) print (sys.getfilesystemencoding()) —终端为UTF-8,locale为zh_CN.GBK—————– ascii - sys.getdefaultencoding() utf8 - sys.getdefaultencoding() GBK - sys.stdout.encoding:GBK - sys.stdout.encoding:?й? - u 中国 - a?й? - a.decode('utf-8')?й? - a.decode('utf-8').encode('gbk') 中国 - a.decode('utf-8').encode('utf-8') 中国 - a.decode('utf-8').encode() GBK - (sys.stdout.encoding) True GBK utf-8 —终端为UTF-8,locale为zh_CN.UTF-8—————– ascii - sys.getdefaultencoding() utf8 - sys.getdefaultencoding() UTF-8 - sys.stdout.encoding:UTF-8 - sys.stdout.encoding:中国 - u 中国 - a 中国 - a.decode('utf-8')?й? - a.decode('utf-8').encode('gbk') 中国 - a.decode('utf-8').encode('utf-8') 中国 - a.decode('utf-8').encode() UTF-8 - (sys.stdout.encoding) True UTF-8 utf-8 —终端为GBK,locale为zh_CN.GBK—————– ascii - sys.getdefaultencoding() utf8 - sys.getdefaultencoding() GBK - sys.stdout.encoding:GBK - sys.stdout.encoding:中国 - u 涓???? - a 中国 - a.decode('utf-8') 中国 - a.decode('utf-8').encode('gbk') 涓???? - a.decode('utf-8').encode('utf-8') 涓???? - a.decode('utf-8').encode() GBK - (sys.stdout.encoding) True GBK utf-8 —终端为GBK,locale为zh_CN.UTF-8—————– ascii - sys.getdefaultencoding() utf8 - sys.getdefaultencoding() UTF-8 - sys.stdout.encoding:UTF-8 - sys.stdout.encoding:涓???? - u 涓???? - a 涓???? - a.decode('utf-8') 中国 - a.decode('utf-8').encode('gbk') 涓???? - a.decode('utf-8').encode('utf-8') 涓???? - a.decode('utf-8').encode() UTF-8 - (sys.stdout.encoding) True UTF-8 utf-8 例子1总结,对print而言:unicode的数据如果要显示正常,必须终端与locale一致。
sys.stdout.encoding这个值应该来自locale,print会以sys.stdout.encoding去encode并输出到字节流。encode为终端编码的字节流就能显示正常,无论locale是啥。
最。