遍历子文件编码格式互换(UTF-8与GB2312)

2023-11-07

遍历子文件编码格式互换(UTF-8与GB2312)

在日常开发中,我们经常会遇到需要将文件的编码格式从一种转换为另一种的情况,特别是在不同的操作系统和编辑器之间共享代码文件时。本篇文章将介绍一个Python脚本,用于遍历指定文件夹下的所有.c.h文件,实现编码格式的互换,即从UTF-8转换为GB2312,或者从GB2312转换为UTF-8,并且还能清除文件中的空行。

使用场景

  • 当项目中的代码文件需要从一种编码格式转换为另一种编码格式时,特别是在协作开发或文件共享时。
  • 当代码文件中存在大量空行,需要一键清除时。

代码功能

  1. 遍历指定文件夹下的所有.c.h文件。
  2. 将文件的编码格式从源编码格式转换为目标编码格式。
  3. 清除文件中的空行,保持代码整洁。

代码思路

  1. 导入必要的库:os用于文件操作,chardet用于检测文件编码。
  2. 编写convert_encoding函数,接受文件路径、源编码格式和目标编码格式作为参数,实现编码格式转换。
  3. 编写convert_files_in_folder函数,遍历指定文件夹下的文件,调用convert_encoding实现编码转换。
  4. 编写cleanup_file函数,用于清除文件中的空行。
  5. 编写cleanup_files_in_folder函数,遍历指定文件夹下的文件,调用cleanup_file进行空行清除。
  6. 在主程序中,指定目标文件夹路径、源编码格式和目标编码格式,分别调用convert_files_in_foldercleanup_files_in_folder函数。

示例图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mUMEUXp7-1692757789629)(图片链接)]

源代码

import os
import chardet


# 函数:convert_encoding
# 参数:file_path - 文件路径
#      source_encoding - 源编码格式
#      target_encoding - 目标编码格式
# 用途:将指定文件的编码从源编码格式转换为目标编码格式
def convert_encoding(file_path, source_encoding, target_encoding):
    # 打开文件以二进制只读模式读取文件内容
    with open(file_path, 'rb') as f:
        content = f.read()
        # 使用 chardet 检测文件内容的编码格式
        detected_encoding = chardet.detect(content)['encoding']

        # 如果检测到的编码格式为 None,将使用 source_encoding 作为默认编码
        if detected_encoding is None:
            detected_encoding = source_encoding

        # 如果检测到的编码与目标编码相同,直接返回
        if detected_encoding == target_encoding:
            return

        # 将文件内容按照检测到的编码解码为字符串
        content = content.decode(detected_encoding)

    # 打开文件以目标编码格式写入文件内容
    with open(file_path, 'w', encoding=target_encoding) as f:
        f.write(content)


# 函数:convert_files_in_folder
# 参数:folder_path - 文件夹路径
#      source_encoding - 源编码格式
#      target_encoding - 目标编码格式
# 用途:遍历指定文件夹下的所有 .c 和 .h 文件,并将其编码格式转换为目标编码格式
def convert_files_in_folder(folder_path, source_encoding, target_encoding):
    # 遍历指定文件夹及其子文件夹中的所有文件
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            # 如果文件以 .c 或 .h 结尾,则执行编码转换
            if file.endswith(('.c', '.h')):
                file_path = os.path.join(root, file)
                # 调用 convert_encoding 函数进行编码转换
                convert_encoding(file_path, source_encoding, target_encoding)
                print(f"Converted: {file_path}")


# 函数:cleanup_file
# 参数:file_path - 文件路径
# 用途:清理文件中的空行
def cleanup_file(file_path):
    with open(file_path, 'rb') as f:
        content = f.read()
        detected_encoding = chardet.detect(content)['encoding']

        if detected_encoding is None:
            detected_encoding = 'utf-8'

        content = content.decode(detected_encoding, errors='replace')
        lines = content.splitlines()

        cleaned_lines = []
        for line in lines:
            if line.strip():  # 如果不是空白行
                cleaned_lines.append(line)

        # 确保最后一行是空行
        if cleaned_lines and cleaned_lines[-1]:
            cleaned_lines.append('')  # 添加一个空行

        cleaned_content = '\n'.join(cleaned_lines)

    with open(file_path, 'w', encoding=detected_encoding, newline='') as f:
        f.write(cleaned_content)


# 函数:cleanup_files_in_folder
# 参数:folder_path - 文件夹路径
# 用途:遍历指定文件夹下的所有 .c 和 .h 文件,并清理文件中的空行
def cleanup_files_in_folder(folder_path):
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file.endswith(('.c', '.h')):
                file_path = os.path.join(root, file)
                cleanup_file(file_path)
                print(f"Cleaned: {file_path}")


if __name__ == "__main__":
    target_folder_convert = r"D:\学习\PythonCode\User"
    source_encoding_convert = "utf-8"
    target_encoding_convert = "gb2312"
    convert_files_in_folder(target_folder_convert, source_encoding_convert, target_encoding_convert)
    print("编码转换完成。")

    cleanup_files_in_folder(target_folder_convert)
    print("空行删除完成。")

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

遍历子文件编码格式互换(UTF-8与GB2312) 的相关文章

  • 在 Python 中解析 TCL 列表

    我需要在双括号上拆分以空格分隔的 TCL 列表 例如 OUTPUT 172 25 50 10 01 01 Ethernet 172 25 50 10 01 02 Ethernet Traffic Item 1 172 25 50 10 01
  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • 在 Python 中将列表元素作为单独的项目返回

    Stackoverflow 的朋友们大家好 我有一个计算列表的函数 我想单独返回列表的每个元素 如下所示 接收此返回的函数旨在处理未定义数量的参数 def foo my list 1 2 3 4 return 1 2 3 4 列表中的元素数
  • Django Rest Framework 是否有第三方应用程序来自动生成 swagger.yaml 文件?

    我有大量的 API 端点编写在django rest framework并且不断增加和更新 如何创建和维护最新的 API 文档 我当前的版本是 Create swagger yaml文件并以某种方式在每次端点更改时自动生成 然后使用此文件作
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 如何使用 Selenium 和 ChromeDriver 解决 TypeError: 'module' object is not callable 错误 [重复]

    这个问题在这里已经有答案了 代码试验 from selenium import webdriver from selenium webdriver chrome options import Options as Chromeoptions
  • 导入错误:没有名为flask.ext.login的模块

    我的flask login 模块有问题 我已经成功安装了flask login模块 另外 从命令提示符我可以轻松运行此脚本 不会出现错误 Python 2 7 r27 82525 Jul 4 2010 07 43 08 MSC v 1500
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • 带有 LSTM 的 GridSearchCV/RandomizedSearchCV

    我一直在尝试通过 RandomizedSearchCV 调整 LSTM 的超参数 我的代码如下 X train X train reshape X train shape 0 1 X train shape 1 X test X test
  • 如何使用 AWS Lambda Python 读取 AWS S3 存储的 Word 文档(.doc 和 .docx)文件内容?

    我的场景是 我尝试使用 python 实现从 Aws Lambda 读取 AWS 存储的 S3 word 文档 doc 和 docx 文件内容 下面的代码是我使用的 我的问题是我可以获取文件名 但无法读取内容 def lambda hand
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 如何将 Django 中的权限添加到模型并使用 shell 进行测试

    我在模型中添加了 Meta 类并同步了数据库 然后在 shell 中创建了一个对象 它返回 false 所以我真的无法理解错误在哪里或者缺少什么是否在其他文件中可能存在某种配置 class Employer User Employer in
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • 如何在 Flask 中的视图函数/会话之间传递复杂对象

    我正在编写一个 Web 应用程序 当 且仅当 用户登录时 该应用程序从第三方服务器接收大量数据 这些数据被解析为自定义对象并存储在list 现在 用户在应用程序中使用这些数据 调用不同的视图 例如发送不同的请求 我不确定什么是最好的模式在视
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • MQTT.fx连接阿里云

    第一步 查看阿里云设备 MQTT 参数 点击 设备 点击 设备信息 点击mqtt连接参数 查看 第2步 打开 MQTT fx 软件 点击 齿轮 点击 新建项目 输入项目名称 MQTT test 01 复制mqtt连接参数 clientId
  • GDAL库简介以及在Windows下编译过程

    GDAL Geospatial Data Abstraction Library 地理空间数据抽象库 是一个在X MIT许可协议下的开源栅格空间数据转换库 官网http www gdal org index html 也可参考GitHub
  • Could not connect to ‘192.168.203.128‘ (port 22): Connection failed.

    问题展示 请在保证虚拟机和宿主机之间完美连接之后 再看此篇文章 如何保证呢 操作请看这篇 Linux虚拟机与Windows宿主机间的通信 如何验证呢 当然是 ping 啊 虚拟机 ping 主机 通 主机 ping 虚拟机 通 通常情况下
  • obj文件

    obj 文件是一种常用的 3D 模型文件格式 它由许多顶点坐标 法向量和纹理坐标组成 可以用来描述复杂的三维模型 obj 文件是一种文本文件 可以使用纯文本编辑器打开 也可以使用专门的 3D 模型软件来打开 编辑和渲染 obj 文件通常与
  • 1800亿参数,世界顶级开源大模型Falcon官宣!碾压LLaMA 2,性能直逼GPT-4

    来源 新智元 导读 一经发布 地表最强开源模型Falcon 180B直接霸榜HF 3 5万亿token训练 性能直接碾压Llama 2 一夜之间 世界最强开源大模型Falcon 180B引爆全网 1800亿参数 Falcon在3 5万亿to
  • 电路中的输入与输出电阻计算

    电路的输入与输出电阻计算 前言 一 输入电阻 1 一端口网络的概念 一端口网络的特性 输入电阻的计算方法 前言 本人是大二电子系的一个学生 大二上在学习模电 当学习到各种BJT电路 FET电路 差分放大电路或负反馈放大电路时 新学习的增益计
  • 生信学习——生信人的20个R语言习题(上)(附详细答案解读)

    题目目录 1 安装一些R包 2 了解ExpressionSet对象 比如CLL包里面就有data sCLLex 找到它包含的元素 提取其表达矩阵 使用exprs函数 查看其大小 3 了解 str head help函数 作用于第二步提取到的
  • 第 14 篇 : 安装Docker

    1 安装 任选其一 从160 165依次安装 批量安装 1 1 按照官方文档安装 Install on CentOS 1 2 通过阿里云镜像安装 推荐 sudo yum remove docker docker client docker
  • 陶氏公司将出席2023第二届中国汽车碳中和峰会

    2023第二届中国汽车碳中和峰会将于10月19日 20日在上海举办 本次峰会将为行业领导者 政策制定者和专家提供一个平台 讨论汽车行业减少碳排放的策略 专家们将从政策 供应链 ESG 替代能源解决方案 汽车材料创新 法律等不同领域分享碳中和
  • 01.个人项目难点汇总2 css定制科技感缺角边框

    01 CSS3实现缺角矩形 折角矩形以及缺角边框 前言 前几天偶然看到缺角矩形这个功能 脑袋中第一想法是 搞个绝对定位的伪元素 哪里需要挡哪里 或者找UI小哥聊聊天 忽然灵光一闪 想起之前翻过的 CSS揭秘 一书 记得有这个篇章 遂有了此文
  • react入门+UMI

    React 一 创建项目 安装基本第三方库以及配置所需目录 sudo npm i g create react app npm下安装react环境 create react app react demo 创建一个项目名为react demo
  • 从Gles、Vulkan到Metal(一)-- 数据和提交

    无论以任何形式本篇文章内容 请注明来自leonnwei的csdn blog 引言 一直想整理下关于移动端图形编程API的文档 图形API为何重要 如果说图形编程的内功是计算机图形学的诸原理和算法 那么外功就是实实在在的硬件API 不能精通A
  • Apache License 2.0

    Apache License 2 0 是 Apache 软件基金会发布的开源软件许可证 它是一种宽松的 允许商用的许可证 适用于开源项目和商业项目 Apache 2 0 许可证是一个相对较新的版本 于2004年发布 取代了早期的 Apach
  • 决策树——信息熵,条件熵,信息增益

    1 信息熵 信息熵是度量样本集的纯合度的一种常用的指标 熵值越大 随机变量的不确定性越高 比如 0 0 01 1 1 1 1 2 3 4 5 6 7 在这两组数据中 上面的数据的不确定性要小 只有两种可能性 抽中的数字2的概率为1 2 所以
  • overleaf写论文笔记(latex)

    overleaf官网 www overleaf com overleaf中文版 cn overleaf com 目录 从零开始 获取模板 文章标题修改 作者修改 摘要 页脚文字重叠 遮挡 三线表绘制 表格内单元格合并 不同行列数不同 文字加
  • 黑盒、白盒、灰盒,如何选择合适的模糊测试工具?

    在软件开发和安全领域 模糊测试是一种常用技术 用于发现应用程序或系统中的潜在漏洞和安全弱点 选择不同的模糊测试方法将极大地影响测试的有效性和效率 本文将比较对比黑盒 白盒和灰盒模糊测试的特点和优势并提供选型指导 模糊测试的分类 黑盒模糊测试
  • JDBC学习笔记一之JDBC的下载、引用、标准api介绍

    1 下载MySQL的JDBC驱动jar包 进入MySQL官网 https www mysql com 然后按图操作 2 下载Oracle的JDBC驱动jar包 按图提示操作 2 1引用Oracle的JDBC驱动jar包 2 2 Oracle
  • 软件测试工程师工作有多累?怎么入门学习软件测试呢?

    软件测试随着时间的发展 越来越受欢迎了 那么 你了解过软件测试吗 软件测试工程师工作累吗 跟随千锋一起来了解一下吧 1 其实IT行业都需要经常加班的 所以软件测试和软件开发其实都一样 当然了 一般来说开发会更累一点 2 目前国内软件测试的待
  • neo4j 内存介绍

    描述Neo4j内存配置和使用的不同方面 内容翻译neo4j 操作手册 1 总览 1 1 操作系统内存 必须保留一些内存以运行操作系统本身的进程 不可能显式配置应为操作系统保留的RAM数量 因为这是在配置页面缓存和堆空间之后仍保持可用的RAM
  • 遍历子文件编码格式互换(UTF-8与GB2312)

    遍历子文件编码格式互换 UTF 8与GB2312 在日常开发中 我们经常会遇到需要将文件的编码格式从一种转换为另一种的情况 特别是在不同的操作系统和编辑器之间共享代码文件时 本篇文章将介绍一个Python脚本 用于遍历指定文件夹下的所有 c