使用python批量转换编码时多余换行的问题

最近使用python批量将项目中的GBK编码文件转换为UTF8时遇到了会自动给每一行结尾多添加一个换行符的问题这样会导致多行宏命令失效
原因是使用文本读写模式 ‘w’ ‘r’
修改为使用 ‘wb’ ‘rb’ 使用二进制接收在使用utf8编码为str然后以二进制方式写入就可以了
完整脚本如下

import os
import sys
import codecs
import chardet
 
 
def get_file_extension(file):
    (filepath, filename) = os.path.split(file)
    (shortname, extension) = os.path.splitext(filename)
    return extension
 
 
def get_file_encode(filename):
    with open(filename, 'rb') as f:
        data = f.read()
        encoding_type = chardet.detect(data)
        # print(encoding_type)
 
    return encoding_type
 
 
def process_dir(root_path):
    for path, dirs, files in os.walk(root_path):
        for file in files:
            file_path = os.path.join(path, file)
            process_file(file_path, file_path)
 
 
def process_file(filename_in, filename_out):
    """
    filename_in :输入文件(全路径+文件名)
    filename_out :保存文件(全路径+文件名)
    文件编码类型: 'windows-1251','UTF-8-SIG'
    """

    extension = get_file_extension(filename_in).lower()
    if not (extension == '.c' or extension == '.h' or extension == '.cpp' or extension == '.hpp'):
        return
 
    # 输出文件的编码类型
    dest_file_encode = 'utf-8'
    encoding_type = get_file_encode(filename_in)
    src_file_encode = encoding_type['encoding']
   
    if src_file_encode == 'utf-8':
        return
    elif src_file_encode is None:
        src_file_encode = 'windows-1251'
 
    print("[Convert]File:" + filename_in + " from:" + encoding_type['encoding'] + " to:UTF-8")
 
    try:
        with codecs.open(filename=filename_in, mode='rb', encoding=src_file_encode) as fi:
            data = fi.read().encode(dest_file_encode)
            with open(filename_out, mode='wb') as fo:
                fo.write(data)
                fo.close()
 
        with open(filename_out, 'rb') as f:
            data = f.read()
            print(chardet.detect(data))
    except Exception as e:
        print(e)
 
 
def dump_file_encode(root_path):
    for path, dirs, files in os.walk(root_path):
        for file in files:
            filename = os.path.join(path, file)
            with open(filename, 'rb') as f:
                data = f.read()
                encoding_type = chardet.detect(data)
                print("FILE:" + file + " ENCODE:" + str(encoding_type))
 
 
def convert(path):
    """
    批量转换文件编码格式
    path :输入文件或文件夹
    """
    # sys.argv[1], sys.argv[2]
    if os.path.isfile(path):
        process_file(path, path)
    elif os.path.isdir(path):
        process_dir(path)
 
 
if __name__ == '__main__':
    convert(r'C:\work')
    #dump_file_encode(r'')

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 使用windows命令和iconv.exe批量转换文件编码 项目中遇到一个问题,本地的txt文件上传到onedri...
    硅谷少年阅读 5,087评论 1 1
  • 人生最曼妙的风景,竟是内心的淡定与从容。我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系。 有...
    BeautifulSoulpy阅读 4,127评论 0 1
  • 一. 什么是编码 将明文转换为计算机可以识别的的编码文本称为“编码”, 反之从计算机可识别的编码文本转回明文为“解...
    Techml阅读 10,277评论 0 3
  • Python2和Python3的编码区别: 1:什么是字符串编码? 在计算机的世界,所有的数据本质上都由二进制表示...
    龙燕呀阅读 4,373评论 0 0
  • 字节字符串和字符字符串字节字符串s是在console上看着是中文,但是正在输出的确是字节字符串,而不是字符字符串。...
    大道至简_Andy阅读 3,587评论 0 1