使用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二分法实现实例
Nov 21 Python
python k-近邻算法实例分享
Jun 11 Python
Python实现解析Bit Torrent种子文件内容的方法
Aug 29 Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
你真的了解Python的random模块吗?
Dec 12 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
Django中密码的加密、验密、解密操作
Dec 19 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
python编程的核心知识点总结
Feb 08 Python
尝试使用Python爬取城市租房信息
Apr 12 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 什么是PEAR?(第二篇)
2009/03/19 PHP
php在window iis的莫名问题的测试方法
2013/05/14 PHP
如何用php获取文件名后缀
2013/06/09 PHP
php加密解密函数authcode的用法详细解析
2013/10/28 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
网页常用特效代码整理
2006/06/23 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
python将人民币转换大写的脚本代码
2013/02/10 Python
Python使用wxPython实现计算器
2018/01/30 Python
python3实现多线程聊天室
2018/12/12 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
Python跳出多重循环的方法示例
2019/07/03 Python
python文件和文件夹复制函数
2020/02/07 Python
python实现查找所有程序的安装信息
2020/02/18 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
初中班主任教育随笔
2015/08/15 职场文书
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers