文件编码格式一直是很多人特别头疼的一件事情,最近由于跨平台开发,经常出现编码格式的问题。所以关于编码格式转换采用python的方式记录下来以便后期需要。让我们一起走进python对编码格式的操作之路
编码格式介绍
- ASCII码:使用单字节编码,所以范围基本只有英文字母、数字和一些特殊字符;只有256个字节。
- Unicode:能够表示全世界的所有字符。
- GBK:只用来编码汉字的,GBK全称《汉字编码扩展规范》双字节编码。
- UTF-8:针对Unicode的可变字符编码,又称万能码。
三方库文件
chardet、codecs
库文件简介
在Python中,codecs模块提供了实现这些规则的方法,通过模块公开的方法我们能够方便地获取某种编码方式的Encoder和 Decoder工厂函数(Factory function),以及StreamReader、StreamWriter和StreamReaderWriter类。
在处理字符串时,常常会遇到不知道字符串是何种编码,如果不知道字符串的编码就不能将字符串转换成需要的编码。面对多种不同编码的输入方式,是否会有一种有效的编码方式?chardet是一个非常优秀的编码识别模块。
代码转换实例
Main函数
import os
import sys
import codecs
import chardet
#将路径下面的所有文件,从原来的格式变为UTF-8的格式
def Main():
path = '文件路径'
(floders, files) = list_folders_files(path)
for file in files:
file_name =os.path.join(floders,file)
with open(file_name, "rb") as f_in:
data = f.read()
code_type = chardet.detect(data)['encoding']
file_convert(file_name,file, code_type, 'UTF-8')
文件转换代码
def convert(file_name,file, in_code="GBK", out_code="UTF-8"):
"""
该程序用于将目录下的文件从指定格式转换到指定格式,默认的是GBK转到UTF-8
:param file: 文件路径
:param in_code: 输入文件格式
:param out_code: 输出文件格式
:return:
"""
out_path='输出文件路径'
try:
with codecs.open(file_name, 'r', incode) as f_in:
new_content = f_in.read()
f_out = codecs.open(os.path.join(out_path,file), 'w', out_code)
f_out.write(new_content)
f_out.close
except IOError as err:
print("I/O error: {0}".format(err))
获取指定文件夹下文件
import os
def list_folders_files(path):
"""
返回 "文件夹" 和 "文件" 名字
:param path: "文件夹"和"文件"所在的路径
:return: (list_folders, list_files)
:list_folders: 文件夹
:list_files: 文件
"""
list_folders = []
list_files = []
for file in os.listdir(path):
file_path = os.path.join(path, file)
if os.path.isdir(file_path):
list_folders.append(file)
else:
list_files.append(file)
return (list_folders, list_files)
Linux 命令行转换
iconv命令用于文件编码的转换,
碰到gbk编码的文件,需要转换成utf8,直接使用该命令即可。
命令用法
- iconv –list :列出iconv支持的编码列表
语法
iconv -f 原编码 -t 新编码 filename -o newfile
参数说明
参数 | 参数描述 |
---|---|
-f | from 来源编码 |
-t | to 转换后新编码 |
-c | 忽略无效字符 |
-s | –silent,忽略警告 |
-o file | 可选,没有的话直接, 转换当前文件,使用-o 保留源文件 |
命令实例
- 查看文件
$ file test test: UTF-8 Unicode text
- 转换
$ iconv -f utf8 -t gbk test -o test.gbk
- 效果
$ file test* test: UTF-8 Unicode text test.gbk: ISO-8859 text