KeyFC欢迎致辞,点击播放
资源、介绍、历史、Q群等新人必读
KeyFC 社区总索引
如果你找到这个笔记本,请把它邮寄给我们的回忆
KeyFC 漂流瓶传递活动 Since 2011
 

[代发][更新]文本编码转换 源码[Python]

[ 7564 查看 / 7 回复 ]

RT。详细|6L|
最后编辑_栗子咪 最后编辑于 2013-12-24 19:47:33
分享 转发


我還沒有被忘記呢
我還沒有被記住呢

TOP

...一般我都是直接用UE更改的。。。。。
1

评分次数

    KFC第三届版杀 戏服 日向秀树
    TOP

    python字符串+=效率一直不佳,每次都会重新创建对象,因此有强迫症的人可能会这样去转换编码:
    "".join([eachfile.decode(de).encode('utf-8') for eachfile in file])
    优势是:列表推导可以预先进行存储优化(加速内存分配),join 操作则是内存一次直接拷贝(减少操作次数)
    这类做法速度要快好几倍,其它迭代通常也会用类似的思想
    缺点是内存吃的要多一些
    最后编辑公主的猫 最后编辑于 2013-12-22 08:25:56
    1

    评分次数

      TOP

      我觉得注明一下py版本2.7顺便给个py的安装教程比较好
      第一次用py的时候因为版本问题,连"hello world"都报错的槿槿泪奔QAQ
      TOP

      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以上版本都不会有问题
      TOP

      好的,这是同学的最新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 19:39:24
      TOP

      回复 4# 枸鸺槿 的帖子

      對了有個Pies
      最新版本2.5.0
      是py 2和3 的兼容層。
      詳見開源中國 oschina.net
      TOP

      對了有個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的未来,但是这一个未来真正到来还是有些遥远的
      最后编辑公主的猫 最后编辑于 2014-01-24 21:03:54
      TOP