You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

补充说明

  1. 手动维护的映射表覆盖了常见的西里尔字母和符号,如果你的文件里有特殊字符,可以根据实际的编码片段补充映射关系。
  2. 如果你不想手动处理映射,也可以用现成的数据分析库简化操作——比如pandas支持直接读取SLK文件,pd.read_slk(_filename)会自动处理编码转换,省去手动解析的步骤。

内容的提问来源于stack exchange,提问作者MasyGreen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:57:32