如何将 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
。
我这样打开我的文件:
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
。