使用Python批量对文本文件编码互转的方法

 更新时间:2023年03月24日 15:51:04   作者:Biem  
这篇文章主要介绍了使用Python批量对文本文件编码互转的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在Windows下写C语言默认是GB2312,放到Linux上就会乱码,因为Linux和MacOS默认是UTF-8,因此写了个Python小脚本对指定路径下的文件进行转换。

from sys import argv
import os
from chardet import detect
from codecs import lookup

CONFIG_FILE = '.any2any'
DEFAULT_CONFIG = '''
.c
.h
.cpp
.hpp
.hxx
.cc
.cxx
.C
.c++
.m
.cs
.rs
.java
.kt
.php
.pm
.pl
.py
.sh
.go
.xml
.htm
.html
.css
.js
.jsx
.vue
.txt
.csv
'''

if os.path.exists(CONFIG_FILE):
    with open(CONFIG_FILE, 'r') as config_file:
        file_extension = tuple(config_file.read().split())
else:
    file_extension = tuple(DEFAULT_CONFIG.split())
print(f"将转换 {' '.join(list(file_extension))}")


def bytes_encoding(b: bytes, length: int = 1024) -> str:
    '''
    返回探测到的编码格式
    '''
    return detect(b[:length])['encoding']


def any2any(b: bytes, encoding: str) -> bytes:
    '''
    任意编码字节转换为任意编码字节

    探测输入的字节编码格式,转换为指定编码,并返回对应字节
    '''
    file_encoding = bytes_encoding(b)
    if file_encoding == encoding:
        return b
    return lookup(encoding).encode(lookup(file_encoding).decode(b)[0])[0]


def allfileset(path: str = '.', filepathset: set = set()) -> set:
    '''
    递归路径下所有文件,返回绝对路径集合
    '''
    if os.path.isdir(path):
        for item in os.listdir(path):
            filepath = os.path.join(path, item)
            if os.path.isfile(filepath):
                filepathset.add(os.path.abspath(filepath))
            else:
                allfileset(filepath, filepathset)
    else:
        filepathset.add(os.path.abspath(path))
    return filepathset


def is_valid_inputs() -> bool:
    '''
    检查参数是否输入正确
    '''
    return len(argv) > 1 and all(map(os.path.exists, argv[1:]))


def is_valid_encoding(encoding: str) -> bool:
    '''
    检查是否存在指定编码
    '''
    try:
        lookup(encoding)
        return True
    except:
        return False


def choice_encoding() -> str:
    choice = input('''!!!在转换前注意备份文件!!!
要转换到什么编码?
1. GB18030(Windows下常用,C语言不会乱码)
2. UTF-8(非Windows下通用,例如Linux和macOS)
3. 其他
> ''')
    if choice == '1':
        return 'GB18030'
    elif choice == '2':
        return 'UTF-8'
    elif choice == '3':
        choice = input('输入你想转换到的编码:')
        while not is_valid_encoding(choice):
            choice = input('不存在该编码,重新输入:')
        return choice
    else:
        print('不做任何操作')
        exit()


def main():
    if is_valid_inputs():
        encoding = choice_encoding()
        filepathset = set()
        for path in argv[1:]:
            filepathset.union(filter(lambda s: s.endswith(file_extension), allfileset(path, filepathset)))
        if filepathset:
            for path in filepathset:
                with open(path, 'rb') as f:
                    filebytes = any2any(f.read(), encoding)
                with open(path, 'wb') as f:
                    f.write(filebytes)
                print(f'{path} 已转换到 {encoding}')
            print('转换已完成')
        else:
            print('没有任何可以转换的文件,请检查程序下是否有.any2any配置文件,用空格或换行间隔要转换的文件类型,例如 .c .cpp .cs')
    else:
        print("未收到任何要转换的文件或文件夹路径,或参数错误,请把要转换的文件或文件夹拖动到程序上。")

if __name__ == "__main__":
    try:
        main()
    finally:
        input('按任意键退出...')

可以使用pyinstaller打包成可执行文件,带着走或者分享给其他人用

安装pyinstaller

conda install pyinstaller

打包Python文件,其中-i参数可以给.exe文件加上图标,-F参数指定要打包的脚本

pyinstaller -i icon.ico -F any2any.py

最后打包好的可执行文件在dict路径下

到此这篇关于使用Python批量对文本文件编码互转的方法的文章就介绍到这了,更多相关Python批量转换文本文件编码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Django实现日志记录报错信息

    基于Django实现日志记录报错信息

    这篇文章主要介绍了基于Django实现日志记录报错信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 基于Python绘制个人足迹地图

    基于Python绘制个人足迹地图

    这篇文章主要介绍了基于Python绘制个人足迹地图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python 写入训练日志文件并控制台输出解析

    Python 写入训练日志文件并控制台输出解析

    这篇文章主要介绍了Python 写入训练日志文件并控制台输出解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python 文本滚动播放器的实现代码

    Python 文本滚动播放器的实现代码

    这篇文章主要介绍了Python 文本滚动播放器的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Python映射类型之dict详解

    Python映射类型之dict详解

    这篇文章主要为大家详细介绍了Python映射类型之dict,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • django的ORM模型的实现原理

    django的ORM模型的实现原理

    这篇文章主要介绍了django的ORM模型的实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Python连接Mysql进行增删改查的示例代码

    Python连接Mysql进行增删改查的示例代码

    这篇文章主要介绍了Python连接Mysql进行增删改查的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • PyTorch中permute的基本用法示例

    PyTorch中permute的基本用法示例

    pytorch中的permute就像是numpy中的transpose()函数一样,根据指定的维度进行转置,下面这篇文章主要给大家介绍了关于PyTorch中permute的基本用法,需要的朋友可以参考下
    2022-04-04
  • Python绘制浪漫星空的示例代码

    Python绘制浪漫星空的示例代码

    Python的turtle是一个基于tkinter的Python图形库,可以帮助初学者轻松地理解和绘制图形,本文就来通过turtle绘制一个浪漫的星空动画吧
    2023-09-09
  • python3实现公众号每日定时发送日报和图片

    python3实现公众号每日定时发送日报和图片

    这篇文章主要为大家详细介绍了python3实现公众号每日定时发送日报和图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论