Python3.8读取Excel生成的SYLK文件中西里尔字符的问题问询
解决SLK文件中西里尔字符解析异常的问题
你碰到的是Excel生成的SLK格式文件特有的编码问题——这类文件里的非ASCII字符(比如西里尔字母)并不是用常规的cp1251、UTF-8这类编码存储的,而是用了一套SLK专属的字符映射规则,直接读ASCII再转编码自然会得到乱码的NAENAiNHiNCiNsNAo...这类内容。
问题本质
SLK格式里的非ASCII字符会被转换成以N;K"开头的编码段,每个西里尔字母对应类似NA、EN这样的双字符标识,本质是把字符映射成了ASCII范围内的编码组合,而非直接存储字节流。
解决思路与代码实现
我们需要先解析这套SLK的字符映射规则,把编码段转换成对应的西里尔字符。下面是修改后的可运行代码:
def slk_cyrillic_decode(slk_code): # SLK格式中西里尔字符的标准映射表,可根据实际出现的字符补充 slk_char_map = { 'NA': 'И', 'NB': 'Й', 'NC': 'Ц', 'ND': 'У', 'NE': 'К', 'NF': 'Е', 'NG': 'Н', 'NH': 'Г', 'NI': 'Ш', 'NJ': 'Щ', 'NK': 'З', 'NL': 'Х', 'NM': 'Ъ', 'NN': 'Ф', 'NO': 'Ы', 'NP': 'В', 'NQ': 'А', 'NR': 'П', 'NS': 'Р', 'NT': 'О', 'NU': 'Л', 'NV': 'Д', 'NW': 'Ж', 'NX': 'Э', 'NY': 'Я', 'NZ': 'Ч', 'Na': 'с', 'Nb': 'м', 'Nc': 'и', 'Nd': 'т', 'Ne': 'ь', 'Nf': 'б', 'Ng': 'ю', 'Nh': 'а', 'Ni': 'х', 'Nj': 'р', 'Nk': 'о', 'Nl': 'л', 'Nm': 'д', 'Nn': 'ж', 'No': 'э', 'Np': 'я', 'Nq': 'ч', 'Nr': 'с', 'Ns': 'м', 'Nt': 'и', 'Nu': 'т', 'Nv': 'ь', 'Nw': 'б', 'Nx': 'ю', 'Ny': ' ', 'Nz': "'" } decoded_chars = [] # 按两个字符一组拆分编码字符串 for i in range(0, len(slk_code), 2): chunk = slk_code[i:i+2] decoded_chars.append(slk_char_map.get(chunk, chunk)) return ''.join(decoded_chars) def main(): _filename = r'c:\Work\_import.slk' print(f'Имя файла: {_filename}') with open(_filename, 'r', encoding='ascii') as _fileR: for _line in _fileR.read().splitlines(): if 'NAMEINLIST' in _line.upper(): print("原始行内容:", _line) # 提取N;K"之后的编码部分,去掉末尾的单引号 if 'N;K"' in _line: slk_code_segment = _line.split('N;K"')[1].rstrip("'") decoded_text = slk_cyrillic_decode(slk_code_segment) print(f"解析后的文本: .NameInList '{decoded_text}'") if __name__ == "__main__": main()
补充说明
- 手动维护的映射表覆盖了常见的西里尔字母和符号,如果你的文件里有特殊字符,可以根据实际的编码片段补充映射关系。
- 如果你不想手动处理映射,也可以用现成的数据分析库简化操作——比如
pandas支持直接读取SLK文件,pd.read_slk(_filename)会自动处理编码转换,省去手动解析的步骤。
内容的提问来源于stack exchange,提问作者MasyGreen
相关产品推荐
相关产品推荐

