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

作者:Valine 时间:2023-03-07 03:19:41 

由于这两天换了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()

来源:https://lasion.top/%E4%BD%BF%E7%94%A8python%E6%89%B9%E9%87%8F%E8%BD%AC%E6%8D%A2%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81%E4%B8%BAUTF-8.html

标签:python,批量,转换,UTF-8
0
投稿

猜你喜欢

  • nlp自然语言处理学习CBOW模型类实现示例解析

    2023-08-08 00:26:03
  • Python yield 使用方法浅析

    2023-03-30 11:15:18
  • Flask处理Web表单的实现方法

    2021-10-20 17:13:36
  • PHP中非常有用却鲜有人知的函数集锦

    2023-11-24 14:29:47
  • 如何使用python爬取知乎热榜Top50数据

    2021-11-13 05:47:09
  • Python实现获取汉字偏旁部首的方法示例【测试可用】

    2022-10-26 16:42:16
  • pycharm如何设置自动生成作者信息

    2021-01-21 22:20:58
  • 利用色轮选择颜色搭配[译]

    2009-10-31 18:24:00
  • Python Matplotlib绘制动图平滑曲线

    2022-12-28 22:23:40
  • Sql Server 查询性能优化之走出索引的误区分析

    2012-05-22 18:56:52
  • asp截取字符串的两种应用

    2009-08-19 17:11:00
  • 学ASP应该注意ASP程序书写的规范标准

    2008-10-17 10:16:00
  • Python psutil模块简单使用实例

    2023-08-10 21:15:37
  • 5个css布局的常见问题及解决方法

    2009-11-19 13:21:00
  • 较完善的日历组件js源码(兼容)

    2010-08-08 08:43:00
  • python+opencv识别图片中的圆形

    2022-02-10 00:04:23
  • React实现表格选取

    2023-08-25 02:56:17
  • Pandas使用Merge与Join和Concat分别进行合并数据效率对比分析

    2023-03-13 12:14:01
  • 一波神奇的Python语句、函数与方法的使用技巧总结

    2023-05-12 19:48:41
  • python中open函数的基本用法示例

    2021-08-03 20:42:31
  • asp之家 网络编程 m.aspxhome.com