鱼C论坛

 找回密码
 立即注册
查看: 1840|回复: 3

[已解决]python3.11求助将制定目录下的ini文件不管是什么编码都改为utf-8

[复制链接]
发表于 2023-6-26 10:15:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
要求:
中文不能为乱码
编码全部为改为utf-8
文件全部改为unix


如下我写了后有的文件的中文是乱码了,应该原来是Ascall码改为utf-8成了乱码
        encoding = 'utf-8'
        for root, dirs, files in os.walk(self.factoryroot_path):
            for file in files:
                if file.endswith('.ini'):
                    file_path = os.path.join(root, file)
                    os.system('dos2unix ' + file_path)
                    # 以读取二进制文件的方式打开 ini 文件
                    with codecs.open(file_path, 'rb') as f:
                        content = f.read().decode(encoding, 'ignore')
                        
                    # 以写入二进制文件的方式重新保存 ini 文件
                    with codecs.open(file_path, 'wb') as f:
                        f.write(content.encode(encoding))
最佳答案
2023-6-26 10:18:00
本帖最后由 isdkz 于 2023-6-26 10:19 编辑

在你的代码中,你已经将所有的ini文件都预设为了utf-8编码来读取,这在处理那些不是utf-8编码的文件时会造成问题,如你提到的中文乱码问题。解决这个问题的一种方法是在读取文件前先判断文件的编码类型,然后使用相应的编码来读取文件。

Python标准库中没有提供检测文件编码的函数,但是我们可以使用第三方库 chardet 来判断文件的编码。下面是一个改进的代码示例:
import os
import codecs
import chardet

for root, dirs, files in os.walk(self.factoryroot_path):
    for file in files:
        if file.endswith('.ini'):
            file_path = os.path.join(root, file)
            os.system('dos2unix ' + file_path)
            # 使用chardet库来判断文件的编码
            rawdata = open(file_path, "rb").read()
            result = chardet.detect(rawdata)
            encoding = result['encoding']

            # 根据检测到的编码来读取文件
            with codecs.open(file_path, 'r', encoding=encoding) as f:
                content = f.read()

            # 以utf-8编码重新保存 ini 文件
            with codecs.open(file_path, 'w', encoding='utf-8') as f:
                f.write(content)

注意,在写文件时我们改为了'w'模式,因为我们要以文本模式写入文件,不再需要用到'wb'模式。使用chardet库后,我们就能正确识别并处理各种编码的文件了,但是注意chardet库可能无法识别出所有类型的编码,尤其是一些非常罕见的编码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-26 10:18:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-6-26 10:19 编辑

在你的代码中,你已经将所有的ini文件都预设为了utf-8编码来读取,这在处理那些不是utf-8编码的文件时会造成问题,如你提到的中文乱码问题。解决这个问题的一种方法是在读取文件前先判断文件的编码类型,然后使用相应的编码来读取文件。

Python标准库中没有提供检测文件编码的函数,但是我们可以使用第三方库 chardet 来判断文件的编码。下面是一个改进的代码示例:
import os
import codecs
import chardet

for root, dirs, files in os.walk(self.factoryroot_path):
    for file in files:
        if file.endswith('.ini'):
            file_path = os.path.join(root, file)
            os.system('dos2unix ' + file_path)
            # 使用chardet库来判断文件的编码
            rawdata = open(file_path, "rb").read()
            result = chardet.detect(rawdata)
            encoding = result['encoding']

            # 根据检测到的编码来读取文件
            with codecs.open(file_path, 'r', encoding=encoding) as f:
                content = f.read()

            # 以utf-8编码重新保存 ini 文件
            with codecs.open(file_path, 'w', encoding='utf-8') as f:
                f.write(content)

注意,在写文件时我们改为了'w'模式,因为我们要以文本模式写入文件,不再需要用到'wb'模式。使用chardet库后,我们就能正确识别并处理各种编码的文件了,但是注意chardet库可能无法识别出所有类型的编码,尤其是一些非常罕见的编码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-26 10:31:29 | 显示全部楼层
能先帮忙看下模块安装错误的问题吗
python3.11 -m pip install cchardet  
Collecting cchardet
  Using cached cchardet-2.1.7.tar.gz (653 kB)
  Preparing metadata (setup.py) ... done
Building wheels for collected packages: cchardet
  Building wheel for cchardet (setup.py) ... error
  error: subprocess-exited-with-error
  
  × python setup.py bdist_wheel did not run successfully.
  │ exit code: 1
  ╰─> [23 lines of output]
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build/lib.linux-x86_64-cpython-311
      creating build/lib.linux-x86_64-cpython-311/cchardet
      copying src/cchardet/version.py -> build/lib.linux-x86_64-cpython-311/cchardet
      copying src/cchardet/__init__.py -> build/lib.linux-x86_64-cpython-311/cchardet
      running build_ext
      building 'cchardet._cchardet' extension
      creating build/temp.linux-x86_64-cpython-311
      creating build/temp.linux-x86_64-cpython-311/src
      creating build/temp.linux-x86_64-cpython-311/src/cchardet
      creating build/temp.linux-x86_64-cpython-311/src/ext
      creating build/temp.linux-x86_64-cpython-311/src/ext/uchardet
      creating build/temp.linux-x86_64-cpython-311/src/ext/uchardet/src
      creating build/temp.linux-x86_64-cpython-311/src/ext/uchardet/src/LangModels
      gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -Isrc/ext/uchardet/src -I/usr/local/python3.11/include/python3.11 -c src/cchardet/_cchardet.cpp -o build/temp.linux-x86_64-cpython-311/src/cchardet/_cchardet.o
      src/cchardet/_cchardet.cpp:196:27: fatal error: longintrepr.h: No such file or directory
         #include "longintrepr.h"
                                 ^
      compilation terminated.
      error: command '/usr/bin/gcc' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for cchardet
  Running setup.py clean for cchardet
Failed to build cchardet
Installing collected packages: cchardet
  Running setup.py install for cchardet ... error
  error: subprocess-exited-with-error
  
  × Running setup.py install for cchardet did not run successfully.
  │ exit code: 1
  ╰─> [25 lines of output]
      running install
      /usr/local/python3.11/lib/python3.11/site-packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
        warnings.warn(
      running build
      running build_py
      creating build
      creating build/lib.linux-x86_64-cpython-311
      creating build/lib.linux-x86_64-cpython-311/cchardet
      copying src/cchardet/version.py -> build/lib.linux-x86_64-cpython-311/cchardet
      copying src/cchardet/__init__.py -> build/lib.linux-x86_64-cpython-311/cchardet
      running build_ext
      building 'cchardet._cchardet' extension
      creating build/temp.linux-x86_64-cpython-311
      creating build/temp.linux-x86_64-cpython-311/src
      creating build/temp.linux-x86_64-cpython-311/src/cchardet
      creating build/temp.linux-x86_64-cpython-311/src/ext
      creating build/temp.linux-x86_64-cpython-311/src/ext/uchardet
      creating build/temp.linux-x86_64-cpython-311/src/ext/uchardet/src
      creating build/temp.linux-x86_64-cpython-311/src/ext/uchardet/src/LangModels
      gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -Isrc/ext/uchardet/src -I/usr/local/python3.11/include/python3.11 -c src/cchardet/_cchardet.cpp -o build/temp.linux-x86_64-cpython-311/src/cchardet/_cchardet.o
      src/cchardet/_cchardet.cpp:196:27: fatal error: longintrepr.h: No such file or directory
         #include "longintrepr.h"
                                 ^
      compilation terminated.
      error: command '/usr/bin/gcc' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: legacy-install-failure

× Encountered error while trying to install package.
╰─> cchardet

note: This is an issue with the package mentioned above, not pip.
hint: See above for output from the failure.

[notice] A new release of pip available: 22.3.1 -> 23.1.2
[notice] To update, run: pip3 install --upgrade pip
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-26 11:13:54 | 显示全部楼层
isdkz 发表于 2023-6-26 10:18
在你的代码中,你已经将所有的ini文件都预设为了utf-8编码来读取,这在处理那些不是utf-8编码的文件时会造 ...

跪谢大大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 17:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表