【发布时间】:2014-12-06 02:04:50
【问题描述】:
我正在尝试获取一个包含奇数字符的 Unicode 文件流,并使用流阅读器将其包装起来,该流阅读器会将其转换为 Ascii,忽略或替换所有无法编码的字符。
我的流看起来像:
"EventId","Rate","Attribute1","Attribute2","(。・ω・。)ノ"
...
我尝试动态更改流如下所示:
import chardet, io, codecs
with open(self.csv_path, 'rb') as rawdata:
detected = chardet.detect(rawdata.read(1000))
detectedEncoding = detected['encoding']
with io.open(self.csv_path, 'r', encoding=detectedEncoding) as csv_file:
csv_ascii_stream = codecs.getreader('ascii')(csv_file, errors='ignore')
log( csv_ascii_stream.read() )
log 行上的结果是:UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-40: ordinal not in range(128),尽管我使用 errors='ignore' 显式构造了 StreamReader
我希望结果流(读取时)如下所示:
"EventId","Rate","Attribute1","Attribute2","(?????)?"
...
或者,"EventId","Rate","Attribute1","Attribute2","()"(使用'ignore'而不是'replace')
为什么还是会发生异常?
我已经看到很多解码字符串的问题/解决方案,但我的挑战是在读取流时更改流(使用.next()),因为文件可能太大而无法一次全部加载到内存中使用.read()
【问题讨论】:
-
为什么不直接使用
io.open(self.csv_path, 'r', encoding='ascii', errors='ignore')? -
@dano 我的印象是,如果我以 ascii 格式打开一个 UTF-16 文件,每 8 位将被错误地解释为一个字符,而不是每 16 位,整个文件将被误读。我的目标是以正确的编码读取文件,然后即时将其转换为 ascii 流。
标签: python python-2.7 encoding stream codec