1

我这样打开我的文件:

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返回一个 str() (它没有decode()方法)。

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

4

1 回答 1

4

linecache如您的用法所示,采用文件名,而不是文件对象。它没有提供编码。同样来自文档

回溯模块使用它来检索源代码行以包含在格式化的回溯中。

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

输入.txt

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

测试.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.

于 2015-02-25T16:52:33.253 回答