后台小程序开发的全方位指南
993
2022-11-09
python 删除gbk无法编码符号——递归函数返回None的问题
问题:
当前项目文件夹下有一个 data_old 文件夹
里面是 utf-8 编码的 txt 文件(注:python3 默认是 utf-8 编码)
现对 data_old 文件夹里的每一个文件逐行读取,删除 gbk 无法编码的字符然后写入到 data 文件夹
思路:
根据报错无法编码的位置,删除该对应字符,直到不报错(可以 gbk 编码为止),即递归调用
import reimport 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_listdef 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)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~