读取阿拉伯语txt生成DataFrame时触发NoneType不可下标报错
问题原因
报错和阿拉伯语内容、文件编码没有关系,是文件名提取的正则表达式写法错误导致的:
你写的正则re.compile('\\(.*)\.txt')经过字符串转义后,实际匹配规则是匹配带字面量左括号(、后续接任意字符、以.txt结尾的字符串。之前处理英文文件能正常运行,是因为当时的英文文件名恰好包含(字符,正则可以命中;阿拉伯语文件名里没有左括号,fileName.search(file)的返回值是None,后续执行key[1]时就会触发NoneType不可下标的报错。
修复方法
删掉正则里多余的、用来转义左括号的反斜杠即可,推荐用正则原生字符串前缀r避免转义冲突,修正后的代码:
# 修正前错误写法:fileName = re.compile('\\(.*)\.txt') fileName = re.compile(r'(.*)\.txt')
可选优化
- 提前过滤非txt文件,避免把目录、其他后缀的文件纳入处理流程
- 增加正则匹配结果校验,遇到不符合命名规则的文件打印提示后跳过,避免程序直接中断
- 提取无后缀文件名可以直接用os库内置方法,比正则兼容性更强,不会出现转义错误:
os.path.splitext(os.path.basename(file_path))[0]
优化后的完整可运行代码:
import os import pandas as pd filePath = [] for file in os.listdir("./arabic_txt"): if file.endswith(".txt"): filePath.append(os.path.join("./arabic_txt", file)) data = {} for file in filePath: # 直接用os方法提取无后缀文件名,无需正则 doc_name = os.path.splitext(os.path.basename(file))[0] with open(file, "r", encoding='utf-8') as readFile: data[doc_name] = [readFile.read()] df = pd.DataFrame(data).T.reset_index().rename(columns = {'index':'document', 0:'text'})
内容的提问来源于stack exchange,提问作者Misclogo
相关产品推荐
相关产品推荐

