KeyFansClub

首页 » - 特色讨论区 - » 土豆星 » [代发][更新]文本编码转换 源码[Python]
_栗子咪 - 2013/11/10 23:07:00
RT。详细[url=#690757][O]|6L|[/O][/url]
蓝月狼 - 2013/11/10 23:48:00
...一般我都是直接用UE更改的。。。。。
公主的猫 - 2013/12/22 8:18:00
python字符串+=效率一直不佳,每次都会重新创建对象,因此有强迫症的人可能会这样去转换编码:
"".join([eachfile.decode(de).encode('utf-8') for eachfile in file])
优势是:列表推导可以预先进行存储优化(加速内存分配),join 操作则是内存一次直接拷贝(减少操作次数)
这类做法速度要快好几倍,其它迭代通常也会用类似的思想
缺点是内存吃的要多一些
枸鸺槿 - 2013/12/22 14:11:00
我觉得注明一下py版本2.7顺便给个py的安装教程比较好
第一次用py的时候因为版本问题,连"hello world"都报错的槿槿泪奔QAQ
公主的猫 - 2013/12/22 18:04:00
2.7和3基本上语法通用了,差异主要是在于使用的一些库,还有就是unicode,str和bytes之间的关系,新开发的东西很方便就可以在代码层面上实现兼容,不需要2to3之类的东西

至于安装,大多数linux和unix上现在2.x都是标配,而且比较新的版本很多还并存有3.x(使用命令python 3),gentoo更是已经把3.3作为默认的python。

没有自带3.x的也不担心,随便搜一艘,rpm,deb,dmg包一堆,自己编译一个一般也就15分钟搞定,建议尽量用3吧。

windows的话感觉安装也没压力,安装程序默认进行了文件关联,自带IDEL,唯一的问题可能就是想再命令行下使用需要自己添加环境变量。

语法上建议尽可能遵从3.x
print("hello world!")
这种写法2.6以上版本都不会有问题
リン - 2013/12/24 19:32:00
好的,这是同学的最新version
  1. # -*- coding:utf-8 -*-
  2. #!/bin/env python
  3. import chardet,sys,thread,os


  4. def encodeFile(fi,de):
  5.     # a=raw_input("输入您需要转换文件的绝对路径,回车键结束\n")
  6.     #try:
  7.     file=open(fi,'r')
  8.     # except IOError,diag:
  9.     #    file.close()
  10.     #    file=diag
  11.     #    print'err:%s'%file

  12.     eachnewfile=""
  13.     for eachfile in file:
  14.         eachfile=eachfile.decode(de).encode('utf-8')
  15.         eachnewfile+=eachfile
  16.     #    print eachfile
  17.     file.close()

  18.     #print '读取完成,等待写入新文件\n'
  19.     newfile='uni.'+os.path.split(fi)[-1]
  20.     # try:
  21.     newWriteFile=open(newfile,'w+')
  22.     # except IOError,diag:
  23.     #    newWriteFile.close()
  24.     #    newWriteFile=diag
  25.     #    print'打开新文件出错%s'%newWriteFile

  26.     newWriteFile.write(eachnewfile)

  27.     #print('保存成功!')
  28. files=sys.argv[1]
  29. def tran_code(file):
  30.     try:
  31.         ocode=chardet.detect(file)
  32.         print file+' is '+ocode['encoding']
  33.         encodeFile(file,ocode['encoding'])
  34.     except :
  35.         print u"自动识别失败 请手动输入原始编码\n"
  36.         code=raw_input()
  37.         try:
  38.             encodeFile(file,code)
  39.         except :
  40.             print 'error'
  41.     else:
  42.         print file+'.......success!\n'
  43. if os.path.isdir(files):
  44.     os.chdir(files)
  45.     files = os.listdir(files)
  46.     for file in files:
  47.         tran_code(file)
  48. else:
  49.   #print os.path.split(files)
  50.     os.chdir(os.path.split(files)[0])
  51.     tran_code(files)
复制代码
此外他还做了这个。你明白的。
  1. # -*- coding:utf-8 -*-
  2. import os,re 
  3. import urllib,httplib
  4. import sys
  5. reload(sys)
  6. sys.setdefaultencoding('utf-8')
  7. def envir():
  8.     url = "http://222.190.111.117:8023/" 
  9.     content=''
  10.     #httplib.HTTPConnection.debuglevel = 1 
  11.     page = urllib.urlopen(url) 
  12.     # print "status:", page.getcode() #200请求成功,404 
  13.     # print "url:", page.geturl() 
  14.     # print "head_info:\n",  page.info() 
  15.     #print "Content len:", page.read()
  16.     content=str(page.read()).replace(" ","")
  17.         #print page.read() 
  18.     AQI = content.find(u'AQI_data_number')
  19.     content=content[AQI+332:AQI+654]
  20.     content=content.splitlines()
  21.         #print con.encode('utf-8')
  22.     a = "API: "+content[0][:3]
  23.     b = content[2][4:-5].decode('utf-8')
  24.     c = content[3][4:-5].decode('utf-8')
  25.     d = u'主要污染物: '+content[-1][4:-5].replace('<sub>','').replace('</sub>','')

  26.     return a+'\n'+b+'\n'+c+'\n'+d
  27. print envir()
复制代码
最后一些说(fei)明(hua)。
同学现使用的OS为Ubuntu,VIM和win8.1,Sublime Text.(当然他还用过MacOSX  MountainLion,BackTrack...
リン推荐使用Sublime Text
リン - 2013/12/24 20:40:00
對了有個Pies
最新版本2.5.0
是py 2和3 的兼容層。
詳見開源中國 oschina.net
公主的猫 - 2013/12/26 14:28:00
對了有個Pies
最新版本2.5.0
是py 2和3 的兼容層。
詳見開源中國 oschina.net
リン 发表于 2013/12/24 20:40:00


如果已经决定把工作环境转移到python3的话,其实寻求一个兼容层意义就不大了
猫自己写的web框架是基于python3的,同时兼容2.7,实际上兼容性的代码总共就是个位数的行,而且都集中在IO操作方面,个人觉得有经验的开发者,编码时就能有效避免兼容问题
更何况现在更多的情况是2to3的情况,极少出现3to2的情况

还有一些问题是兼容层无法直接搞定的历史问题,例如使用相当频繁的print;在2.x时代print是作为语句使用的,但是到了3.x为了适合函数式编程print变为了函数,尽管2.6以后python2也允许print("something")这样的语法,但是print作为语句的特性并没有改变,例如下面的表达式在python3里面是成立的,但是2却报错:
y and print("z")
为了实现兼容就需要定义一个近似的函数
def xprint(*arg,**darg):
    #do something
这个实现不仅麻烦,低效,而且今后程序的部署也对兼通层产生了强烈的依赖,成为下一个历史遗留问题。
其实换个思路,解决办法其实很简单:不去使用这样的用法,至少现在不要去使用 》《

现在python3遇到的最大囧境是:很多项目几乎都停留在2.x,不论人员还是代码,这使得我们看到的很多第三方3.x库都是2.x环境下开发,然后用2to3转换到3。由于3.x推进缓慢,加上又有2to3这样本身已经很成熟的工具,所以短时间内想让各个项目组转移到3.x环境下进行开发就不太现实。

虽然大多数人目前都还是看好python3的未来,但是这一个未来真正到来还是有些遥远的
1
查看完整版本: [代发][更新]文本编码转换 源码[Python]