使用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中将字典转换为XML以及相关的命名空间解析
Oct 15 Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
Python解析excel文件存入sqlite数据库的方法
Nov 15 Python
13个最常用的Python深度学习库介绍
Oct 28 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
Python和Go语言的区别总结
Feb 20 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
python 读取.nii格式图像实例
Jul 01 Python
class类在python中获取金融数据的实例方法
Dec 10 Python
Python爬取梨视频的示例
Jan 29 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
php获取网页内容方法总结
2008/12/04 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
2013/06/18 PHP
php实现上传图片生成缩略图示例
2014/04/13 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
删除节点的jquery代码
2014/01/13 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
canvas的神奇用法
2017/02/03 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
2019/02/22 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
机修工岗位职责
2013/11/24 职场文书
妇产医师自荐信
2014/01/29 职场文书
《埃及的金字塔》教学反思
2014/04/07 职场文书
推荐信格式要求
2014/05/09 职场文书
团拜会策划方案
2014/06/07 职场文书
资料员岗位职责
2015/02/10 职场文书
学历证明范文
2015/06/16 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
mysql联合索引的使用规则
2021/06/23 MySQL
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android
Python jiaba库的使用详解
2021/11/23 Python
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js