`
yiminghe
  • 浏览: 1465452 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

python转换文件编码应用

阅读更多

初次写python应用,比较简单的转换文件编码,用来将文件转换到指定编码,主要利用了 open 文件操作,os 目录遍历,chardet 编码探测,解决 movist(多字幕播放器) 只能正确读取utf-8字幕文件问题,一次将目录下所有字幕都转换城utf-8编码.

 

ps:发现使用多线程后,时间反而会上升一倍,看来对于小任务线程还是开销比较大的

 

/Users/yiminghe/code/python/tools/encode.py :

 

# -*- coding: utf-8 -*-
import sys,os,shutil,traceback,time
from chardet.universaldetector import UniversalDetector
#deal with chinese   
encodes={
    "gb2312":"gb18030",
    "gbk":"gb18030"
}
class HeEncodingEx(Exception):
    def __init__(self,msg):
        Exception.__init__(self,msg);
def gb(encoding):
    if encoding is None:
        raise HeEncodingEx,"unknown encoding"
    encoding=encoding.strip().lower()   
    return  encodes[encoding] if encoding in encodes else encoding
   
def transferToEncoding(filename,toCode):
    '''
    save the content of filename to filename with toCode text encoding
    @param filename{string}: text file
    @param toCode{string}: text encoding code ,gbk,utf-8...etc
    @return{boolean}: operation success true/false
    '''
    if(os.path.isdir(filename)):
        print "error:not file"
        return False
        
    try:
        detector = UniversalDetector() 
        #print filename
        #read content
        f=open(filename,"r")
        ls=f.readlines();
        f.close();

        #detect encoding
        for l in ls:
            detector.feed(l)
            if detector.done: break
        detector.close()
        #print detector.result
        #print dir(detector.result)
        encode=gb(detector.result['encoding'])
        #print "original encoding:",encode
        if(encode.lower() != toCode.lower()):
            #backup orginal file
            if not os.path.exists(filename+".bak"):
                shutil.copy(filename, filename+".bak")
            #save to another encoding
            f=open(filename,"w")
            for l in ls:
                f.write(unicode(l,encode).encode(toCode))
            f.close()
            #print "result encoding:"+toCode
        else:
            pass
            #print "same encoding"    
    except BaseException,e:
        #print "error:",e
        traceback.print_exc()
        #restore
        if(os.path.exists(filename+".bak")):
            shutil.copy(filename+".bak", filename)
        return False
    finally:
        print
        print
    return True
    
#main
if __name__=="__main__":
    
    start=time.time()
    
    if len(sys.argv)<2:
        print "erro argv! filename toCoding"
        sys.exit(1)
    #default transfer to utf-8    
    toCode=sys.argv[2] if len(sys.argv) > 2 else "utf-8"
    filename=sys.argv[1]
    if(os.path.isfile(filename)):
        transferToEncoding(filename,toCode)
    else:
        import threading
        #同时10个线程处理文件
        THREAD_NUM=10
        lock=threading._allocate_lock()
        
        
        def fetchAndProcess(files,func):
            '''
            每次取一个元素运行
            @param files{Array}:数据存放数组
            @param func{Function}:处理函数
            '''
            while len(files):
                lock.acquire()
                if len(files)==0:
                    break
                try:
                    file_=files.pop()
                except IndexError,e:
                    print e
                    break
                print threading.current_thread().ident," got : ",file_         
                lock.release()
                func(file_,toCode)
                
        #folder? then walk
        all_files=[]
        for base,folders,files in os.walk(filename):
            if not base.endswith(os.sep) :
                base+=os.sep
            for file_ in files:
                if file_.lower().endswith("srt"):
                    all_files.append(base+file_)
                    if 0:
                        transferToEncoding(base+file_,toCode)
        if 1:
            num=THREAD_NUM
            threads=[];
            #print all_files;
            while num:
                num-=1
                threads.append(threading.Thread(target=fetchAndProcess,args=(all_files,transferToEncoding)))
        
            for thread_ in threads:
                thread_.start()
            
            for thread_ in threads:
                thread_.join()
        
        #10,20,30个线程 40。6秒
        #单线程 28.1秒        
        print "consume time :",time.time()-start    
     
 

 

/Users/yiminghe/code/python/tools/ he_encode.sh:

#!/bin/bash -
#"$@" ,not $* ,$@,"$*"
python /Users/yiminghe/code/python/tools/encode.py "$@"
 

创建软链接

chmod 777 /Users/yiminghe/code/python/tools/he_encode.sh
ln -s /Users/yiminghe/code/python/tools/he_encode.sh /usr/bin 

 

运行:

 

定位在某个目录下运即可:转换目录下的所有字幕文件为utf-8格式

 

he_encode .
 

 

 

分享到:
评论

相关推荐

    python实现算术编码

    算术编码是一种高效的数据压缩方法,它在信息技术和数据传输领域有着广泛的应用。...通过理解和实现这个Python项目,你可以深入理解算术编码的工作原理,并能将其应用于实际的数据压缩场景,优化数据存储和传输效率。

    Shannon_Python香农编码_python_shannon_香农编码_

    在实际应用中,为了方便存储和传输,编码后的二进制字符串通常会被转换成十进制或十六进制表示,并添加适当的头部信息(如编码表的长度和编码表本身),以便解压时能重建编码表。 以上就是一个基于Python的香农编码...

    mac文件编码转换

    "文件编码转换.app"可能是一个专门用于此目的的应用程序,它提供了图形化的用户界面,使得转换过程更加直观和简便。以下是一些关于Mac文件编码转换的知识点: 1. **内置工具:TextEdit** - Mac的默认文本编辑器...

    批量文件编码转换工具

    运行工具后,界面通常会有选项供用户选择源编码类型(如GB2312)和目标编码类型(如UTF-8),以及指定待转换文件的根目录。一旦设置完成,点击转换按钮,工具就会遍历指定目录下的所有文件,逐一进行编码转换。 在...

    Python PEP8 编码规范中文版

    建议将导入语句放在文件顶部,并且分成三部分:标准库的导入、第三方库的导入以及应用自身的导入。每部分导入语句之间用空行隔开。 在注释方面,PEP8提倡使用块注释和行内注释来提高代码的可读性。文档字符串...

    Python批量转换文件编码格式

    ### Python批量转换文件编码格式详解 #### 背景与需求 在日常工作中,我们可能会遇到需要处理大量文件的情况,特别是在文件编码不统一时。例如,如果一批文件原本使用GBK编码,而我们的应用或系统更倾向于使用UTF-8...

    视频格式转换python代码

    在提供的压缩包文件`MP4zhuanhuanAVI`中,很可能包含了实现上述转换过程的Python脚本,供用户参考和学习。通过这个例子,我们可以深入理解Python与OpenCV在视频处理中的应用,以及如何进行视频格式的转换。 总结来...

    文件编码转换器源码

    在这个特定的“文件编码转换器源码”中,主要涉及了从GB2312编码到UTF-8编码的转换。GB2312,全称为《信息交换用汉字编码字符集·基本集》,是中国大陆早期广泛使用的简体中文字符编码标准。而UTF-8则是Unicode ...

    python中的文件读写练习题(csdn)————程序.pdf

    Python 文件读写练习题 Python 语言中处理文件读写是非常重要的一部分,本文将通过实践 exercises ...通过这些 exercises,我们可以更好地理解 Python 中的文件读写操作,并且可以更好地应用这些知识点到实际项目中。

    使用python批量转换文件编码为UTF-8的实现

    在尝试批量转换文件编码时,我们通常会先遍历指定目录下的所有文件,找到需要转换编码的目标文件。这里使用`os.walk()`函数可以递归遍历指定路径下的所有子目录和文件,筛选出特定扩展名的文件,如`.java`文件。 ``...

    Python-CoCoCodeConvert是一个简单的文件编码识别和转换的命令行工具

    CoCoCodeConvert作为Python的一个应用实例,展示了如何利用Python强大的标准库(如`codecs`模块)来处理文件编码问题。开发者可以通过阅读其源代码学习如何编写类似的工具,以提升自己的编程能力。 此外,...

    批量编码转化工具(实现文件编码的自动检测)

    用户可能需要提供待转换文件的路径、目标编码格式,以及是否跳过无法识别编码的文件等选项。工具会根据这些参数执行批量转换操作,并可能在转换完成后生成日志,记录每个文件的处理结果。 5. 编程语言和库: 这个...

    文件转换为Base64编码

    例如,在Python中,可以使用`base64`模块的`b64encode()`和`b64decode()`函数来实现文件的Base64编码和解码。其他语言如Java、JavaScript、C#等也有相应的API支持。 在实际应用中,Base64编码常用于以下场景: - *...

    python 文件读写 乱码

    #### 二、Python文件编码处理 ##### 2.1 文件编码声明 在Python脚本的开头,可以通过添加特定的注释来声明文件编码格式,例如: ```python # coding=gbk ``` 这行代码告诉Python解释器,该文件采用的是GBK编码。...

    Python-将Sketch文件转换为ReactNative组件

    总之,`Python-将Sketch文件转换为ReactNative组件`这一技术旨在提高设计与开发的协同效率,减少手动编码的工作量,确保设计意图准确无误地体现在最终产品中。通过掌握这一技术,开发团队可以更快地将设计概念转化为...

    python的知网caj格式转pdf

    Python在处理文件转换方面具有强大的能力,特别是在学术研究领域,对于CAJ(中国学术期刊)格式的文件,经常需要将其转换为更通用的PDF格式。本文将深入探讨如何使用Python来实现CAJ到PDF的转换,以及涉及的相关知识...

    python:json转换

    在这个场景中,我们有两个Python脚本文件,`trans-json2.py`和`trans-json.py`,它们可能用于将JSON数据转换成不同的风格。 首先,`trans-json.py`可能实现了基本的JSON编码和解码功能。在Python中,我们可以使用`...

    Python设置默认编码为utf8的方法

    Python源代码文件的编码通常由文件的第一行(即“编码声明”)指定,如`# -*- coding: utf-8 -*-`。如果没有这样的声明,Python会默认使用ASCII编码,这可能会导致非ASCII字符的解析错误。 要设置Python默认编码为...

    Python3编码转换指南及实用操作汇总

    内容概要:本文档汇总了在Python3中进行各种类型的编码转换方法,如字节数组转整型,十六进制字符串与字节流之间的转换以及整型到十六进制字符串的转换,适用于解决常见的编码问题。 适合人群:对于需要频繁处理不同...

    python批量实现Word文件转换为PDF文件

    在遍历目录并获取Word文件路径后,我们可以利用Windows的COM组件来转换文件。COM(Component Object Model)是一种接口技术,允许不同应用程序之间交互。在Python中,我们可以使用`win32com.client`模块来访问COM...

Global site tag (gtag.js) - Google Analytics