当前位置: 首页 > 编程笔记 >

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

徐瑞
2023-03-14
本文向大家介绍使用python批量转换文件编码为UTF-8的实现,包括了使用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内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 问题内容: 我需要将文本文件转换为String,最后,我应该将其作为输入参数(类型InputStream)放入IFile.create(Eclipse)。寻找示例或方法,但仍然不知道…需要您的帮助! 只是为了测试,我确实尝试将原始文本文件转换为使用此代码编码的UTF-8 但即使以为最终的* .test.txt文件具有UTF-8编码,里面的字符也已损坏。 问题答案: 您需要使用参数指定的编码。 这也

  • 我需要将多个CSV文件(使用不同的编码)转换为UTF-8。 这是我的代码: 当我尝试运行此代码时,我得到以下错误: UnicodeDecodeError:'utf-8'编解码器无法解码位置5057的字节0xf3:无效的延续字节 有人能帮我吗?谢谢

  • 本文向大家介绍Python批量转换文件编码格式,包括了Python批量转换文件编码格式的使用技巧和注意事项,需要的朋友参考一下 自己写的方法,适用于linux, py2.6以下版本可用代码 支持py3.1的版本 以上所述就是本文 的全部内容了,希望大家能够喜欢。

  • 本文向大家介绍PHP 将ASCII转换为UTF-8编码,包括了PHP 将ASCII转换为UTF-8编码的使用技巧和注意事项,需要的朋友参考一下 如果我们知道当前的编码是ASCII,则可以使用'iconv'函数将ASCII转换为UTF-8。原始字符串可以作为参数传递给iconv函数,以将其编码为UTF-8。 示例 具有特殊字符的字符串被分配给'str'变量。它以当前所在的编码以及需要转换为的编码传递

  • 本文向大家介绍vbs脚本实现批量转换文件编码,包括了vbs脚本实现批量转换文件编码的使用技巧和注意事项,需要的朋友参考一下 最近需要使用SourceInsight查看分析在Linux系统下开发的项目代码,我们知道Linux系统中文本文件默认编码格式是UTF-8,而Windows中文系统中的默认编码格式是Gb2312。系统内的编码格式有所区别倒无伤大雅,关键的是SourceInsight竟不支持UT

  • 问题内容: 我有一个包含unicode字符串的词典列表。 可以将字典列表写入CSV文件。 我希望CSV文件以UTF8编码。 该模块无法处理将unicode字符串转换为UTF8的操作。 该模块文档具有的一切转换为UTF-8的例子: 它也有一个类。 但是…我该如何处理这些?他们是否不必将自己插入其中,以捕获反汇编的字典并对其进行编码,然后再将其写入文件中?我不明白 问题答案: 更新 :第三方unico

  • 问题内容: 我正在用python做一些脚本。我创建一个保存在文件中的字符串。这个字符串有很多数据,来自目录的树状结构和文件名。根据convmv的介绍,我所有的树状结构都是UTF-8。 我想将所有内容都保留在UTF-8中,因为之后我将其保存在MySQL中。现在,在UTF-8的MySQL中,我遇到了一些字符问题(例如é或è-我是法语)。 我希望python始终将字符串用作UTF-8。我在互联网上阅读了

  • 我有一个oracle DB,根据我们的DB管理,没有设置格式,但是当我们将数据导出到文本文件时,它是以utf-8的形式出现的 谁能帮我把这些文本文件转换成Unicode码吗