如何将 linecache 与 unicode 一起使用?

How to use linecache with unicode?

我这样打开我的文件:

with open(sourceFileName, 'r', encoding='ISO-8859-1') as sourceFile:

但是,当我

previousLine = linecache.getline(sourceFileName, i - 1)

我遇到异常

"UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 169: 
invalid start byte

这是因为(我认为)linecache.getline returns 一个 str() (它没有 decode() 方法)。

我的脚本必须能够支持 unicode,所以我不能简单地将输入文件转换为 UTF-8。

正如您的用法所示,

linecache 采用文件名,而不是文件对象。它没有提供编码。同样来自 documentation:

This is used by the traceback module to retrieve source lines for inclusion in the formatted traceback.

这意味着它主要用于Python源代码。事实证明,如果文件有 Python 源文件编码注释,它会起作用:

input.txt

# coding: iso-8859-1
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»
¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

test.py

import linecache
print(linecache.getline('input.txt', 3))

输出

[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»

所以 linecache 可能无法解决您的问题。相反,如您所示打开文件,并可能自己缓存这些行:

with open('x.txt',encoding='iso-8859-1') as f:
    lines = f.readlines()
print(lines[2])

如果您不想读取整个文件,您也可以在读取列表时将行附加到列表中,类似于 linecache