python 删除gbk无法编码符号——递归函数返回None的问题

问题:

当前项目文件夹下有一个 data_old 文件夹

里面是 utf-8 编码的 txt 文件(注:python3 默认是 utf-8 编码)

现对 data_old 文件夹里的每一个文件逐行读取,删除 gbk 无法编码的字符然后写入到 data 文件夹

 

思路:

根据报错无法编码的位置,删除该对应字符,直到不报错(可以 gbk 编码为止),即递归调用

import re
import os


# 按名称排序,获取目录下所有文件
def get_file_list(file_path):
    dir_list = os.listdir(file_path)
    if not dir_list:
        return
    else:
        # 注意,这里使用lambda表达式,key设为下列数值可按照修改时间排序
        # os.path.getmtime() 函数是获取文件最后修改时间
        # os.path.getctime() 函数是获取文件最后创建时间
        dir_list = sorted(dir_list, key=lambda x: int(x[:-4]))  # 去掉.txt
        return dir_list


def killAnUnseen(s):
    try:
        s.encode('gbk')
        # print("return" + s)
        return s
    except UnicodeEncodeError as err:
        mode = re.findall(r'position ([0-9]*): illegal multibyte sequence', str(err))
        # if mode:
        #     print("position:" + mode[0])
        # print(s[int(mode[0])])
        news = s.replace(s[int(mode[0])], "", 1)
        return killAnUnseen(news)


filelist = get_file_list('./data_old')
# filelist = filelist[60:]
for file in filelist:
    print("\r {} is working".format(file), end="")
    result = []
    with open('./data_old/' + file, 'r') as f:  # py3默认utf-8编码
        lines = f.readlines()
        for line in lines:
            try:  # 尝试gbk编码
                line.encode('gbk')
            except UnicodeEncodeError:  # 编码失败,去掉无法编码的字符
                print(line)
                line = killAnUnseen(line)
            result.append(line)
    with open('./data/' + file, 'w', encoding='gbk') as f_new:
        f_new.writelines(result)

注意!!!

递归函数如果有 try 和 except,一定要在两个情况下都写上 return,否则递归时最后一层的 return 不属于最开始的 def,无返回值

下列这样的写法会出现返回 None 的奇怪现象

def killAnUnseen(s):
    try:
        s.encode('gbk')
        # print("return" + s)
        return s
    except UnicodeEncodeError as err:
        mode = re.findall(r'position ([0-9]*): illegal multibyte sequence', str(err))
        # if mode:
        #     print("position:" + mode[0])
        # print(s[int(mode[0])])
        news = s.replace(s[int(mode[0])], "", 1)
        killAnUnseen(news)  # 这里应该写成return killAnUnseen(news)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值