使用Python批量对文本文件编码互转的方法
在Windows下写C语言默认是GB2312,放到Linux上就会乱码,因为Linux和MacOS默认是UTF-8,因此写了个Python小脚本对指定路径下的文件进行转换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | from sys import argv import os from chardet import detect from codecs import lookup CONFIG_FILE = '.any2any' DEFAULT_CONFIG = ''' .c .h .cpp .hpp .hxx .cc .cxx .C .c++ .m .cs .rs .java .kt .php .pm .pl .py .sh .go .xml .htm .html .css .js .jsx .vue .txt .csv ''' if os.path.exists(CONFIG_FILE): with open (CONFIG_FILE, 'r' ) as config_file: file_extension = tuple (config_file.read().split()) else : file_extension = tuple (DEFAULT_CONFIG.split()) print (f "将转换 {' '.join(list(file_extension))}" ) def bytes_encoding(b: bytes, length: int = 1024 ) - > str : ''' 返回探测到的编码格式 ''' return detect(b[:length])[ 'encoding' ] def any2any(b: bytes, encoding: str ) - > bytes: ''' 任意编码字节转换为任意编码字节 探测输入的字节编码格式,转换为指定编码,并返回对应字节 ''' file_encoding = bytes_encoding(b) if file_encoding = = encoding: return b return lookup(encoding).encode(lookup(file_encoding).decode(b)[ 0 ])[ 0 ] def allfileset(path: str = '.' , filepathset: set = set ()) - > set : ''' 递归路径下所有文件,返回绝对路径集合 ''' if os.path.isdir(path): for item in os.listdir(path): filepath = os.path.join(path, item) if os.path.isfile(filepath): filepathset.add(os.path.abspath(filepath)) else : allfileset(filepath, filepathset) else : filepathset.add(os.path.abspath(path)) return filepathset def is_valid_inputs() - > bool : ''' 检查参数是否输入正确 ''' return len (argv) > 1 and all ( map (os.path.exists, argv[ 1 :])) def is_valid_encoding(encoding: str ) - > bool : ''' 检查是否存在指定编码 ''' try : lookup(encoding) return True except : return False def choice_encoding() - > str : choice = input ( '''!!!在转换前注意备份文件!!! 要转换到什么编码? 1. GB18030(Windows下常用,C语言不会乱码) 2. UTF-8(非Windows下通用,例如Linux和macOS) 3. 其他 > ''' ) if choice = = '1' : return 'GB18030' elif choice = = '2' : return 'UTF-8' elif choice = = '3' : choice = input ( '输入你想转换到的编码:' ) while not is_valid_encoding(choice): choice = input ( '不存在该编码,重新输入:' ) return choice else : print ( '不做任何操作' ) exit() def main(): if is_valid_inputs(): encoding = choice_encoding() filepathset = set () for path in argv[ 1 :]: filepathset.union( filter ( lambda s: s.endswith(file_extension), allfileset(path, filepathset))) if filepathset: for path in filepathset: with open (path, 'rb' ) as f: filebytes = any2any(f.read(), encoding) with open (path, 'wb' ) as f: f.write(filebytes) print (f '{path} 已转换到 {encoding}' ) print ( '转换已完成' ) else : print ( '没有任何可以转换的文件,请检查程序下是否有.any2any配置文件,用空格或换行间隔要转换的文件类型,例如 .c .cpp .cs' ) else : print ( "未收到任何要转换的文件或文件夹路径,或参数错误,请把要转换的文件或文件夹拖动到程序上。" ) if __name__ = = "__main__" : try : main() finally : input ( '按任意键退出...' ) |
可以使用pyinstaller打包成可执行文件,带着走或者分享给其他人用
安装pyinstaller
打包Python文件,其中-i
参数可以给.exe文件加上图标,-F
参数指定要打包的脚本
最后打包好的可执行文件在dict路径下
到此这篇关于使用Python批量对文本文件编码互转的方法的文章就介绍到这了,更多相关Python批量转换文本文件编码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
最新评论