笨软件方法学学python的一个小问题!新手求教!!

笨方法学python(6)加分题--列表与字典的区别
这篇对应的是习题39 字典, 可爱的字典
#encoding:utf-8
#列表与字典的区别
thing = ['name',1,'age','AD','sex']
print thing[1]
#print thing['name'] #会报错,列表只能通过整数去访问:TypeError: list indices must be integers, not str
stuff = {'name': 'tom','age': '28','1':'test'}
print stuff['name']
#print stuff[1] #会报错,关键字错误 KeyError: 1
#字典只能通过自己定义的索引去访问,而列表是通过给的索引去访问
#print stuff['tom'] #会报关键字错误KeyError: 'tom'
#通过上面,我们可以知道,(1)列表与字典定义时不一样,[]和{}的区别.(2)访问元素的方式不一样,列表是用系统提供好的整数0 1 2....去访问,而字典的索引是自己定义的 'a':'b' a是索引,b是对应的元素
#列表增加元素
thing.append('new1')
#也可以用insert方法插入
thing.insert(1,'new2')
#下面的方式是错误的 IndexError: list assignment index out of range
#thing[4] = 'new2'
for i in thing:
#列表查询某个元素的索引位置
print thing.index('name')
#列表删除元素,参数是该元素,非元素索引
thing.remove('age')
#也可以用pop删除,删除的时候会返回被删除的值
print thing.pop() #不带参数默认删除最后一个元素
print thing.pop(0)
#还有关于排序的方法 reverse(反向排序) sort
print thing ,u'这个stuff.sort()排序前的结果'
thing.sort()
print thing ,'这个stuff.sort()的结果'
#字典增加元素
stuff['job'] = 'IT'
#setdefault如果有这个索引就返回该索引的元素值,如果没有就插入
stuff.setdefault('new4','default')
#更新某个元素
stuff['job'] = 'IT1'
#for i in stuff:
print stuff['job']
#字典删除元素 pop方法,用法跟列表的一样
print stuff
print stuff.pop("job"),'这个stuff.pop()的结果'
print stuff
#获取某个值
print stuff.get("new4")
#返回整个字典
print stuff.items(),'这个stuff.items()的结果'
#values把列表的值打印出来
print stuff.values(),'这个stuff.values()的结果'
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。问题补充&&
所以整个就是个学习的意思,就是一个 Cannon 类参数问题;,就得到 ANSWER,后面需要加“english”.ar**[1] == &quot,英文表达的很明确了吧,有构造函数.py 后面:PHRA**_FIRST = True首先,你想知道 Cannon 的 Python 代码;下面的代码就是告诉你要用 english 这个参数皆在 ,这不是一个题目啊。if len(english&quot.ar**) == 2 and sys,比如下面这个例子,这就是 Show,不是让你解题啊,展示给你看 Python 是如何实现英文到代码的过程,就输入Cannon
lch743 &4-05 11:01
•回答
•回答
•回答
•回答
•回答
先, answer =,分为random, phra**) #代入单词print &quot,***:print &quot:75line-phra**&;ANSWER。另我觉得不是很有必要print所有的变量.shuffle (snippets)#打乱顺序print &quot,黏贴代码的时候注意缩进,nBYE&quot:Python Codetry,def convert()中你写的没错.在程序中分别命名为snippet还有phra**, answer = convert(n&quot:print &quot:while T;, question print question#传递参数raw_input(&#异常情况处理第四:snippets = PHRA**S,重点在整个程序的理解;answer&76line-snippet&quot.shuffle(snippets)#上面这一个步骤是从五个PHRA**S elements随机选择一个for snippet in snippets, phra**)snippet &quot,这道题目想利用**文件中的单词来替换PHAR**S中的%%%;n\; &quot, answerif PHRA**_FIRST:%s\&#92.keys()#选择keyprint &&gt.s&quot,snippetphra** = PHRA**S[snippet]#提取key值相应的valueprint &73line-snippet&quot, snippetsrandom, convert(snippet, phra**print &quot, phra**)&;77line-%convert( ; % answerexcept EOFError,问题似乎没有出现在那里,@@@。第三,从try的部分看起, snippetprint &quot,否则我们想在机上修改的时候好麻烦(⊙﹏⊙)第二,学习Python代码要会倒着看,PHARA**S是一个dict类;)print &quot
wqlsw123&4-05 11:26
猜你感兴趣
服务声明: 信息来源于互联网,不保证内容的可靠性、真实性及准确性,仅供参考,版权归原作者所有!Copyright &
Powered by水木-Python的自由天空-新手请教,如何查看一个类下面的方法列表
主题文章列表
一共 30 篇
新手请教,如何查看一个类下面的方法列表
发信人:&douglas26&(douglas),&信区:&Python
标&&题:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&15:31:12&2012),&转信
新手,在eclipse+pydev下面写。比如要查找string下面的以特定字符串开头的方法,应该怎么去找啊,用visualstudio的时候有代码提示,敲个点就出来函数列表了..python应该怎么去找自己需要使用的方法
※&来源:·水木社区&http://newsmth.net·[FROM:&162.105.163.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&hgoldfish&(老鱼),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&15:44:56&2012),&转信
pydev不是也可以提示么?
我之前试过,输入:
在那个点号会列出字符串的各种方法。另一种方法是把这些内置函数的操作记熟。
【&在&douglas26&(douglas)&的大作中提到:&】
:&新手,在eclipse+pydev下面写。比如要查找string下面的以特定字符串开头的方法,应该怎么去找啊,用visualstudio的时候有代码提示,敲个点就出来函数列表了..python应该怎么去找自己需要使用的方法
灭绝人性啊
※&来源:·水木社区&newsmth.net·[FROM:&117.24.144.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&douglas26&(douglas),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&15:54:47&2012),&转信
我现在查文档查到了是用startswith()方法,输入“.”虽然会有提示,但是提示的东西好像完全不相关啊,刚刚那个startswith()在提示里面就没有..
以前在vs里面随便一找就能找到,但现在python里想用个最基本的方法都得去文档查一遍..新手都是这么过来的吗?
是不是一般写python的人都完全不用代码提示的啊?如果所有方法都要去看文档的话对新手就太不友好了吧,想问下一般新手开始学的时候都是怎么弄的?难道要先把文档里的常用方法背熟吗..
【&在&hgoldfish&的大作中提到:&】
:&pydev不是也可以提示么?
:&我之前试过,输入:
:&"text".&
:&...................
※&来源:·水木社区&http://newsmth.net·[FROM:&162.105.163.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&douglas26&(douglas),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&16:18:08&2012),&转信
不是说python特别好用,很容易入门的吗..
刚刚查个int转string还得百度1分钟...感觉所有想用的方法基本都得百度或者查文档才能找到,受不鸟了...
【&在&hgoldfish&的大作中提到:&】
:&pydev不是也可以提示么?
:&我之前试过,输入:
:&"text".&
:&...................
※&来源:·水木社区&http://newsmth.net·[FROM:&162.105.163.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&javaboy&(喝了咖啡就话多-_-;),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&16:22:55&2012),&转信
难者不会,会者不难。
你需要找本入门书敲敲代码。
【&在&douglas26&(douglas)&的大作中提到:&】
:&不是说python特别好用,很容易入门的吗..
:&刚刚查个int转string还得百度1分钟...感觉所有想用的方法基本都得百度或者查文档才能找到,受不鸟了...
:&...................
Can't&go&back&to&where&I&used&to&be.
※&来源:·水木社区&newsmth.net·[FROM:&111.214.6.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&Kneo&(Kneo&Fang),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&16:31:23&2012),&转信
难道用VS写C++的时候,int转string光靠IDE提示就能学会?
【&在&douglas26&(douglas)&的大作中提到:&】
:&不是说python特别好用,很容易入门的吗..
:&刚刚查个int转string还得百度1分钟...感觉所有想用的方法基本都得百度或者查文档才能找到,受不鸟了...
※&来源:·水木社区&http://newsmth.net·[FROM:&123.190.247.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&douglas26&(douglas),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&16:33:51&2012),&转信
看了一点入门书,但都是讲语法什么
实际写的时候,遇到要用string类下面的方法,list类下面的方法的时候就无解了...
比如刚刚找了半天也没找到怎么让string.split()能按照多个determiner来分割..
【&在&javaboy&的大作中提到:&】
:&难者不会,会者不难。
:&你需要找本入门书敲敲代码。
※&来源:·水木社区&http://newsmth.net·[FROM:&162.105.163.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&douglas26&(douglas),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&16:37:25&2012),&转信
额,想当然的会想用tostring()来做,如果有代码提示的话就可以找找有没有tostring()这个方法,没有就直接去查,但现在只能先不管三七二十一的写上去,等运行出错了再去查..很麻烦
是不是刚入门的时候最好把文档里那些常用方法记下来?
【&在&Kneo&的大作中提到:&】
:&难道用VS写C++的时候,int转string光靠IDE提示就能学会?
※&来源:·水木社区&http://newsmth.net·[FROM:&162.105.163.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&gfrog&(爱生活,爱水木),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&16:43:45&2012),&转信
你这是想当然的CPP/Java惯性思维吧。
我写CPP还惯性的想写str()呢。
【&在&douglas26&(douglas)&的大作中提到:&】
:&额,想当然的会想用tostring()来做,如果有代码提示的话就可以找找有没有tostring()这个方法,没有就直接去查,但现在只能先不管三七二十一的写上去,等运行出错了再去查..很麻烦
:&是不是刚入门的时候最好把文档里那些常用方法记下来?
再跳烂坑就剁手啊就剁手。
※&来源:·水木社区&newsmth.net·[FROM:&203.114.244.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&Madlee&(无竹居士),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&16:44:56&2012),&转信
自己定义个str函数呗。我现在就这么做,在C++里尽量向python靠拢。
【&在&gfrog&(爱生活,爱水木)&的大作中提到:&】
:&你这是想当然的CPP/Java惯性思维吧。
:&我写CPP还惯性的想写str()呢。
※&来源:·水木社区&newsmth.net·[FROM:&116.246.25.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&hgoldfish&(老鱼),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&16:55:49&2012),&转信
需要懂点技巧。因为pydev不知道变量的类型。所以,输入:
之后,pydev不会提示.startswith()。如果你改成
就行了。或者这个变量已经赋值到一个字符串。比如:
var&=&"text"
也会提示字符串的各种方法。这是动态语言的不足之处,函数参数没有变量类型,不利于IDE做类型推断。
至于用什么方法,难道你用cpp的时候不查MSDN?多用几次就记熟了。
【&在&douglas26&(douglas)&的大作中提到:&】
:&我现在查文档查到了是用startswith()方法,输入“.”虽然会有提示,但是提示的东西好像完全不相关啊,刚刚那个startswith()在提示里面就没有..
:&以前在vs里面随便一找就能找到,但现在python里想用个最基本的方法都得去文档查一遍..新手都是这么过来的吗?
:&是不是一般写python的人都完全不用代码提示的啊?如果所有方法都要去看文档的话对新手就太不友好了吧,想问下一般新手开始学的时候都是怎么弄的?难道要先把文档里的常用方法背熟吗..
:&...................
灭绝人性啊
※&来源:·水木社区&newsmth.net·[FROM:&117.24.144.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&pulo&(普洛米·我们的民族从来不缺乏苦难),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&16:57:20&2012),&转信
多用就记住了。不懂就查文档。
旁边开个解释器窗口,记不清楚的地方自己dir、help,
写过几万行代码的熟手往往也免不了这样。
&&&&s&=&'123'
&&&&dir(s)
['__add__',&'__class__',&'__contains__',&'__delattr__',&
'__doc__',&'__eq__',&'__
format__',&'__ge__',&'__getattribute__',&'__getitem__',&
'__getnewargs__',&'__get
slice__',&'__gt__',&'__hash__',&'__init__',&'__le__',&
'__len__',&'__lt__',&'__mo
d__',&'__mul__',&'__ne__',&'__new__',&'__reduce__',&
'__reduce_ex__',&'__repr__',
&'__rmod__',&'__rmul__',&'__setattr__',&'__sizeof__',&
'__str__',&'__subclasshook
__',&'_formatter_field_name_split',&'_formatter_parser',&
'capitalize',&'center',
&'count',&'decode',&'encode',&'endswith',&'expandtabs',&
'find',&'format',&'index
',&'isalnum',&'isalpha',&'isdigit',&'islower',&'isspace',&
'istitle',&'isupper',
'join',&'ljust',&'lower',&'lstrip',&'partition',&'replace',&
'rfind',&'rindex',&'
rjust',&'rpartition',&'rsplit',&'rstrip',&'split',&
'splitlines',&'startswith',&'
strip',&'swapcase',&'title',&'translate',&'upper',&'zfill']
&&&&help(s.find)
Help&on&built-in&function&find:
&&&&S.find(sub&[,start&[,end]])&-&&int
&&&&Return&the&lowest&index&in&S&where&substring&sub&is&found,
&&&&such&that&sub&is&contained&within&S[start:end].&&Optional
&&&&arguments&start&and&end&are&interpreted&as&in&slice&
&&&&Return&-1&on&failure.
【&在&douglas26&(douglas)&的大作中提到:&】
:&新手,在eclipse+pydev下面写。比如要查找string下面的以特定字符串开头的
方法,应该怎么去找啊,用visualstudio的时候有代码提示,敲个点就出来函数列表
了..python应该怎么去找自己需要使用的方法
※&来源:·水木社区&http://newsmth.net·[FROM:&206.196.52.239]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&hgoldfish&(老鱼),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&16:59:39&2012),&转信
int转str还需要查。你应该找本基础书看看了。python容易入门,并不代表一个从没用过的人拿起python就会用。
【&在&douglas26&(douglas)&的大作中提到:&】
:&不是说python特别好用,很容易入门的吗..
:&刚刚查个int转string还得百度1分钟...感觉所有想用的方法基本都得百度或者查文档才能找到,受不鸟了...
:&...................
灭绝人性啊
※&来源:·水木社区&newsmth.net·[FROM:&117.24.144.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&Kneo&(Kneo&Fang),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&17:01:05&2012),&转信
不懂的就先查文档,再写代码。不要瞎蒙。
一个问题查十分钟,争取一天解决一百个问题。第二天你就是高手了。
要做到想到就敲到,编码速度接近思考的速度,IDE的什么代码提示就没用了。
初学者最大的困难是浮躁。不要纠结于这种小事影响心情。该干什么就干什么。
【&在&douglas26&(douglas)&的大作中提到:&】
:&额,想当然的会想用tostring()来做,如果有代码提示的话就可以找找有没有tostring()这个方法,没有就直接去查,但现在只能先不管三七二十一的写上去,等运行出错了再去查..很麻烦
:&是不是刚入门的时候最好把文档里那些常用方法记下来?
※&来源:·水木社区&http://newsmth.net·[FROM:&123.190.247.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&pulo&(普洛米·我们的民族从来不缺乏苦难),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&17:06:13&2012),&转信
实在想不到,就用下面这个最笨的方法先让代码跑起来总可以吧?
'a.b_c.d-e'.replace('_','.').replace('-','.').split('.')
【&在&douglas26&(douglas)&的大作中提到:&】
:&看了一点入门书,但都是讲语法什么
:&实际写的时候,遇到要用string类下面的方法,list类下面的方法的时候就无解
:&比如刚刚找了半天也没找到怎么让string.split()能按照多个determiner来分
※&来源:·水木社区&http://newsmth.net·[FROM:&206.196.52.239]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&Kneo&(Kneo&Fang),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&17:10:47&2012),&转信
这种问题也没办法通过ide解决。但如果你经常google的话,一分钟就能搜到。
【&在&douglas26&(douglas)&的大作中提到:&】
:&比如刚刚找了半天也没找到怎么让string.split()能按照多个determiner来分割..
※&来源:·水木社区&http://newsmth.net·[FROM:&123.190.247.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&douglas26&(douglas),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&17:10:49&2012),&站内
多谢LS诸位~还是慢慢一步一步来吧
※&来源:·水木社区&http://newsmth.net·[FROM:&162.105.163.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&douglas26&(douglas),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&17:13:06&2012),&转信
另外问一下,用help()命令的时候,提示
&&&&help(s.find)
'more'&不是内部或外部命令,也不是可运行的程序
或批处理文件。
这是什么问题?
【&在&pulo&的大作中提到:&】
:&多用就记住了。不懂就查文档。
:&旁边开个解释器窗口,记不清楚的地方自己dir、help,
:&写过几万行代码的熟手往往也免不了这样。
:&...................
※&来源:·水木社区&http://newsmth.net·[FROM:&162.105.163.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&gfrog&(爱生活,爱水木),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&17:14:23&2012),&转信
推荐下ipython,写小脚本/测试/查手册神器。
【&在&pulo&(普洛米·我们的民族从来不缺乏苦难)&的大作中提到:&】
:&多用就记住了。不懂就查文档。
:&旁边开个解释器窗口,记不清楚的地方自己dir、help,
:&写过几万行代码的熟手往往也免不了这样。
:&...................
再跳烂坑就剁手啊就剁手。
※&来源:·水木社区&newsmth.net·[FROM:&203.114.244.*]
Re: 新手请教,如何查看一个类下面的方法列表
发信人:&gfrog&(爱生活,爱水木),&信区:&Python
标&&题:&Re:&新手请教,如何查看一个类下面的方法列表
发信站:&水木社区&(Wed&Oct&24&17:16:09&2012),&转信
windows还是linux啊?&竟然没more。
linux就装一个,或者&ln&-s&`which&cat`&/bin/more
【&在&douglas26&(douglas)&的大作中提到:&】
:&另外问一下,用help()命令的时候,提示
:&&&&&help(s.find)
:&...................
再跳烂坑就剁手啊就剁手。
※&来源:·水木社区&newsmth.net·[FROM:&203.114.244.*]初学python半年了,多数时间都是在看别人写的代码,看懂了拿来用,真正自己写的极少极少,感觉写代码的能力进步太慢,有什么好的办法可以让我多写起来吗?题主非计算机专业,接触的代码主要以机器学习算法为主,编码能力真的很弱,但很感兴趣,愿意多花时间在练习代码能力上。
我认为“看得多写的少”是学习编程的大忌,而且题主说自己是“Python初学者”,更应该“get your hands dirty”。可能你觉得这段代码不长,而且我看懂了啊,再敲一遍不是浪费时间吗。这样的想法就是阻碍你编码能力提高的原因。网上有一个比较出名的Python在线教程《》,中文又叫做《笨方法学Python》,作者Zed Shaw的看法就是学习编程需要亲自动手敲代码,不管你觉得这些代码有多简单,千万不要Copy-Paste:If you copy-paste, you are cheating yourself out of the effectiveness of the lessons.我还看过这样一段话:Experimentation is essential. Avoid simply reading the finished code, you won’t learn a lot this way. Even with simple cut’n pasting, you’ll get your boatload of problems.编程实质上一门手艺活,卖油翁的“无他, 但手熟尔”当然适用。不亲自动手敲代码、改代码、做实验,那么有些坑你第一次遇到了,第二次碰到还是会掉进去。The hard way is easier. 笨方法就是捷径。
那就找项目直接上手做,不看别人代码,自己上手造一遍轮子。题主说主要接触机器学习算法,那就下载一本Bayesian Reasoning and Machine Learning电子版,作者在个人主页提供免费版下载,同时再下载附带的Matlab库,用python和scipy实现一些基本算法,然后和自带Matlab库的结果对比一下。有不懂地方的看Matlab实现,简单易懂。温馨提示:BRML这本书错误多多,下载时要选择最新版本的……
其实写代码比看代码简单
软件工程硕士在读,关注计算机视觉、机器学习应用页面导航:
→ 正文内容 Python中文问题
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
首先谈谈我是怎么遇到Python中文输入问题的。我写了一个小工具,用来查询Python的库函数。
因为Python是自带文档,可以通过help函数来查询每一个系统函数的用法解释说明。一般来说,关键的使用方法和注意点在这个系统的文档中都说的很清楚。我试图在网上找过系统文档的中文版的函数功能解释,但是都没有找到,所以我决定将就使用英文版的系统自带的函数解释来学习。   如果你想进行Tkinter和wxPython编程,想要知道一般的widget的使用方法和属性介绍,英文又不是太好的话,我推荐你,你可以去看看《Python与Tkinter编程》这本书,里面392页到538页的附录B和附录C选择了常用的函数和近乎所有的属性进行介绍,精彩不容错过。 我上面提到的这个工具很快做好了。可以把没有查询过的函数进行查询,并保存关键字key和查询结果info,便于下次直接从列表list中翻出来看;要是发现没有查过,则手动添加到列表list――就是这样一个简单的小工具。一切看上去都很顺利。但是问题也来了:英文的info打开后,解释里面有的单词不知道含义,查完单词之后想写在info里面,保存之后可以下次直接从硬盘打开看。但是在英文info中输入中文,保存过程中就出现了解码不了的问题,也就是解码到中文部分就弹出下面这个错误来: UnicodeEncodeError: 'ascii' codec can't encode character u'\u6211' in position 61: ordinal not in range(128)   其中的61这个位置是弹性的,就是info中加入了中文的那个位置。这个错误基本一直都存在,也就是当我想要把修改过后的info写入文件的时候:
代码如下: fp = open('tt.txt','w') fp.write(info.encode("UTF-8")) # 此处错误 fp.close()
这三行本身看上去没有错误。但是就是在中间这行代码处出现了错误。难道是encode的方式不对?我有尝试了很多种编码,如ANSI、UTF-8、SHIFT_JIS、GB2312、GBK等编码,发现都不行。于是我就糊涂了。 现在我已经知道为什么错误了。问题就在于修改之后的info这个字符串变量。info中的数据是我从系统中通过help函数查到的字串(也就是原始的纯英文的info)加上我手动输入的中文得到的一个综合的字符串。在我从系统中查询系统文档时,我对原始info进行了如下保存:
代码如下: fp = open('tt.txt','w') fp.write(info) fp.close()
注意,错就错在直接将原始info直接写入到文件中。这样写之后的编码方式大家知道是什么吗?你打开tt.txt,查看编码方式将会知道,其编码方式是ANSI格式。于是错误就是这样产生的:我查询关键字key,将这个ANSI格式的字串info读到控件中显示,然后我有手动的添加了UTF-8格式的中文字符,于是通连起来形成的字符串info,就是一个混乱而具有多种编码方式的字符串info,系统怎么write都无法只使用一种编码方式将这个混合字串info再次写到tt.txt中去。   所以,结论就是:当你在内存中操作时,你可以随意的不管编码方式是什么,系统会自动的按照具体情况进行判断。但是你如果要用到中文字符,并且还要通过文件的方式去暂时保存数据或者字串的话,请你一定要在第一次写文件的时候用utf-8的格式写进去,也就是如下的方式:
代码如下: fp = open('tt.txt','w') fp.write(info.encode("UTF-8")) fp.close()
这将会保证你下次读出来之后不用转换编码方式就可以直接打印和显示,即使是作为控件文本也没有问题。一定要注意这一点。   问题找到了,下面进行一些其他的讨论。 有的人说,只要使用了# -*- coding:utf-8 -*-不就行了吗?其实不然。   通过我的测试(我使用IDLE(Python2.5.4 GUI)编译器。【1】无论我开头用不用# -*- coding:utf-8 -*-,还是软件中是不是设置了使用默认的utf-8编码方式,中文在控件和文件之间的使用都是没有问题的。【2】info='中文'; 这样的操作都是可以的。读的时候使用一般的读法就可以了。原因我想是因为编译器升级,解决了中文显示和使用的问题,早期中文语言不能够使用的情况现在已经不存在了。
代码如下: #coding=utf-8 try: JAP=open("jap.txt","r") CHN=open("chn.txt","r") UTF=open("utf.txt","w") jap_text=JAP.readline() chn_text=CHN.readline() #先decode成UTF-16,再encode成UTF-8 jap_text_utf8=jap_text.decode("SHIFT_JIS").encode("UTF-8") #不转成utf-8也可以 chn_text_utf8=chn_text.decode("GB2312").encode("UTF-8") #编码方式大小写都行utf-8也一样 UTF.write(jap_text_utf8) UTF.write(chn_text_utf8) UTF.close() except IOError,e: print "open file error",e
这是我从中《学习python处理python编码》文章中摘录的代码。这里做一下解释,上面的jap_text_utf8和chn_text_utf8都要保证是机器默认的编码方式,或者utf-8编码方式,最重要的就是要保持一致。通过统一的编码为utf-8后,就可以写入一个文件中,再次读出使用都没有问题。读的时候使用下面的普通方式即可:
代码如下: filen = open('tt.txt') info = filen.read() print info
另外。有人使用了下面这种方式来编码和转换:
代码如下: import sys reload(sys) sys.setdefaultencoding('utf8') def ConvertCN(s): return s.encode('gb18030') def PrintFile(filename): f = file(filename, 'r') for f_line in f.readlines(): print ConvertCN(f_line) f.close() if __name__ == "__main__": PrintFile('1.txt') print ConvertCN("\n****** 按任意键退出! ******") print sys.stdin.readline()
通过我的测试,这种方式是不可行的。第二行如果去掉,第三行的setdefaultencoding函数将会无效;如果保留第二行,第三行和以后的代码都得不到执行(虽然不报错)。这种方式是否可行请大家试试看。          另外,《python 中文乱码 问题深入分析》一文中讲到了很多文本如何编码的问题,令我大开眼界。文本编码的原理:原来就是在文本开头处添加适当的注释符号来表示内部的编码方式,于是解释器就会以某种对应的规则去按照某种步长的字节或者灵活的方式去翻译字节,得到原文,翻译的步长和规则完全是开头的说明处对应的。所以,如果你正文是单个字节的编码方式,那么你就可以在你的编码最前头加上一个合适的规则,告诉别人如何翻译你的被编码文本即可。其中BOM_UTF_8等文本末尾的知识也是很有趣的,类似的还有BOM_UTF_16等等,不同的编码方式文末的符号不同,大家可以注意一下。
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910

我要回帖

更多关于 笨方法学 python 的文章

 

随机推荐