Python过滤CSV阿拉伯文本异常:部分字符输出乱码求助
问题原因与解决方案
你的乱码问题核心不是字符检测逻辑,而是直接用纯文本写入方式处理CSV内容,破坏了CSV格式规则,导致后续打开文件时工具错误识别编码。
具体原因
- 原文件是CSV格式,
csv.reader读取的行可能包含逗号、引号等CSV特殊语法字符。你直接用f.write(mylist[i][0] + "\n")写入时,会打破CSV的格式规范。 - 过滤Lam(U+0644)的行时,刚好这些行没有触发格式冲突,工具能正常识别UTF-8编码;但过滤Kaf(U+0643)的行时,存在格式冲突的内容,导致工具错误将UTF-8字节当作单字节编码(如Latin-1)解析,出现类似
سÙورَةÙ...的乱码。
额外注意:阿拉伯语字符存在连写变体,孤立形式的Kaf(U+0643)在词中/词尾会变成U+FE9B(词中形式)、U+FE9C(词尾形式),如果原文本里的Kaf是这些变体,你的原始检测逻辑会漏匹配。
修复代码(保持CSV格式)
用csv.writer处理写入,严格遵循CSV格式规则,同时覆盖Kaf的所有连写变体:
import csv # 读取原CSV并过滤目标行 with open("Arabic-Original.csv", "r", encoding="utf-8") as in_file: reader = csv.reader(in_file) # 包含Kaf的所有形态:孤立、词中、词尾 target_kafs = {chr(0x0643), chr(0xFE9B), chr(0xFE9C)} filtered_rows = [row for row in reader if any(char in row[0] for char in target_kafs)] # 写入规范的CSV文件 with open("copiedverses.csv", "w", encoding="utf-8", newline='') as out_file: writer = csv.writer(out_file) writer.writerows(filtered_rows)
若需输出纯文本而非CSV
如果不需要保持CSV格式,仅输出经文内容,确保写入编码正确,打开时选择UTF-8编码:
import csv target_kafs = {chr(0x0643), chr(0xFE9B), chr(0xFE9C)} with open("Arabic-Original.csv", "r", encoding="utf-8") as in_file, \ open("copiedverses.txt", "w", encoding="utf-8") as out_file: reader = csv.reader(in_file) for row in reader: if any(char in row[0] for char in target_kafs): out_file.write(row[0] + "\n")
内容的提问来源于stack exchange,提问作者Omar Ibrahim
相关产品推荐
相关产品推荐

