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


Posted in Python onApril 03, 2020

由于这两天换了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内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python连接字符串的方法小结
Jul 13 Python
Python使用logging结合decorator模式实现优化日志输出的方法
Apr 16 Python
python调用xlsxwriter创建xlsx的方法
May 03 Python
对numpy数据写入文件的方法讲解
Jul 09 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
Dec 05 Python
Python3爬虫学习入门教程
Dec 11 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
python实现多进程通信实例分析
Sep 01 Python
给Python学习者的文件读写指南(含基础与进阶)
Jan 29 Python
python3.8动态人脸识别的实现示例
Sep 21 Python
Python列表的深复制和浅复制示例详解
Feb 12 Python
Python matplotlib绘制雷达图
Apr 13 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 #Python
python传到前端的数据,双引号被转义的问题
Apr 03 #Python
Django实现将一个字典传到前端显示出来
Apr 03 #Python
Django 后台带有字典的列表数据与页面js交互实例
Apr 03 #Python
Django import export实现数据库导入导出方式
Apr 03 #Python
Django用户身份验证完成示例代码
Apr 03 #Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 #Python
You might like
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
php中设置index.php文件为只读的方法
2013/02/06 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
PHP PDOStatement::debugDumpParams讲解
2019/01/30 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
符合W3C网页标准的iframe标签的使用方法
2007/07/19 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
浅析Python中的多重继承
2015/04/28 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
python中封包建立过程实例
2021/02/18 Python
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
大一学生的职业生涯规划书范文
2014/01/19 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
大型会议策划方案
2014/05/17 职场文书