使用python批量转换文件编码为UTF-8的实现
由于这两天换了IDE,在导入以前的工程的时候发现了一个大问题,由于以前脑残的我不知道改编码方式,导致出现了大量的GBK,这就很难受,要是一个两个还好说,可是这么多要是一个一个的改我会觉得现在的我比以前还脑残,于是乎,我就想用python批量的修改一下,然后就产生了这篇文章,其中好多不足的地方还请大佬指导
本来一开始的思路还是比较清晰,觉得也比较简单,天真的认为用GBK的方式读取出文件内容,然后UTF8写入就好了,可是在实际的操作中我发现我就是太天真了,出现了大量的问题,比如说:
怎么查看文件的编码方式
好吧我承认就出现了这一个问题。
那么遇到问题我们该怎么办呢,没错,Google,果然功夫不负会Google人,我看到了一个函数,就是chardet.detect()函数,当然要导入chardet模块,也就是pip,如果是Anaconda的环境当我没说,pip了不要打我。言归正传,这个函数是干嘛用的呢?
这个函数会返回一个含有三个键值对的字典类型
- ‘encoding’: 编码方式
- ‘confidence’: 检测的正确率
- ‘language’ : 语言
是不是看到encoding后眼前一亮,这样取出encoding的值然后比较不知道是啥了,然后我就在一边感叹python的强大的第三方库的支持一边开始了对这个函数的测试,先建两个txt,然后脸滚键盘,保存的时候一个是UTF-8,一个是GBK,值得竹注意的是读取方式应该是二进制,也就是’rb’,接着就是兴致勃勃地Ctrl Shift F10,出现了惊人的一幕:
{‘encoding’: ‘utf-8’, ‘confidence’: 0.99, ‘language’: ”}
看看,看看这美丽的单引号,然后直接和”utf-8”比较不就结束了,万万没想到,他竟然是False,我还以为我看错了,就疯狂Ctrl F5,等待奇迹的出现,功夫不负有心人,果然,奇迹没有出现,于是我type了一下,嗯,果然是str类型的,又试了下和”utf-8”比较不就结束了,没错,结果是True,你们听我解释,我昨天做的时候真不是这样的,不管了,写都写了,按昨天的思路来吧,大家凑活看吧(不要打我),现在我们假设他是False,并且类型是NoneType,并且转为str后是None,你们要相信我昨天真的是这样的!
好了就这样吧,那既然是无法比较怎么办呢,没错,拿出一开始脸滚键盘的那两个测试文件来,用他们呢读取出的字典的值作比较不就好了(一说到这我就莫名的心痛),然后我们在想一下是把文件编码改为UTF-8,所以本来就是UTF-8的我们就不用管他,我都脸滚键盘的建测试文件了我还在意这些细节干嘛,不说了,难受,效果图也不贴了,直接上代码你们自己看吧。。。
# coding utf-8
import os
import chardet
# 获得所有java文件的路径,传入根目录路径
def find_all_file(path: str) - str:
for root, dirs, files in os.walk(path):
for f in files:
if f.endswith('.java'):
fullname = os.path.join(root, f)
yield fullname
pass
pass
pass
# 判断是不是utf-8编码方式
def judge_coding(path: str) - dict:
with open('utf.txt', 'rb') as f: # 删除就行
utf = chardet.detect(f.read()) # 同上
with open(path, 'rb') as f:
c = chardet.detect(f.read())
if c != utf: # 改为 c != 'utf-8'
return c
# 修改文件编码方式
def change_to_utf_file(path: str):
for i in find_all_file(path):
c = judge_coding(i)
if c:
change(i, c['encoding'])
print("{} 编码方式已从{}改为 utf-8".format(i, c['encoding']))
def change(path: str, coding: str):
with open(path, 'r', encoding=coding) as f:
text = f.read()
with open(path, 'w', encoding='utf-8') as f:
f.write(text)
# 查看所有文件编码方式
def check(path: str):
for i in find_all_file(path):
with open(i, 'rb') as f:
print(chardet.detect(f.read())['encoding'], ': ', i)
def main():
my_path = 'C:WorkSpace'
change_to_utf_file(my_path)
# check(my_path)
if __name__ == '__main__':
main()
到此这篇关于使用python批量转换文件编码为UTF-8的实现的文章就介绍到这了,更多相关python批量转换UTF-8内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!
- 用线性判别分析 LDA 降维
- Bagging 简述
- 机器学习中常用评估指标汇总
- 用 Grid Search 对 SVM 进行调参
- PCA 的数学原理和可视化效果
- 用 Pipeline 将训练集参数重复应用到测试集
- 什么是 ROC AUC
- SSE(Server-sent events)技术在web端消息推送和实时聊天中的使用
- 详解 Stacking 的 python 实现
- RESTful接口设计原则和优点
- 用 Doc2Vec 得到文档/段落/句子的向量表达
- 手把手用 IntelliJ IDEA 和 SBT 创建 scala 项目
- 项目中记录影响性能的缓慢数据库查询
- memory_profiler的使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode98|判定字符是否唯一
- LeetCode97|合并两个有序链表
- LeetCode99|数组中出现次数超过一半的数字
- redis源码之hash结构的实现
- redis源码之set结构
- redis源码之zset结构的实现
- Elasticsearch: range 数据类型及基于range的聚合 (7.4发行版新功能)
- 漫画:如何在数组中找到和为 “特定值” 的三个数?
- 除了MySQL,大牛DBA还会啥?
- 用 Docker swarm 快速部署分布式图数据库 Nebula Graph 集群
- Labelhub 基于腾讯云 Serverless 技术为人工智能企业提供数据与模型解决方案
- 手把手教你使用 Prometheus 监控 JVM
- 基于云开发 CloudBase 搭建在线视频会议应用
- 手搓一个分布式大气监测系统(六)云端能力更新、说明及源码放出
- maybe incorrect parameters such as bit_rate, rate, width or height