可以寻求并告诉使用Python UTF-8编码的文档工作?
题
我有产生一些大的日志文件的应用程序> 500MB。
我已经用Python写的一些实用工具,可以让我快速浏览日志文件并找到感兴趣的数据。但我现在得到一些数据集所在的文件过大给它的所有加载到内存中。
我从而要扫描的原稿一次,构建一个索引,然后仅加载文档的到存储器的部分,我想看看在时间
这工作对我来说,当我打开“文件”一次读它一行,并存储与来自file.tell偏移()。 然后我可以回来的文件的该部分在后面file.seek(偏移,0)。
然而我的问题是,我可能会在日志文件中UTF-8,所以我需要与编解码器模块(codecs.open(<filename>, 'r', 'utf-8')
)打开它们。随着生成的对象,我可以打电话寻求告诉,但他们不匹配。
我假设的编解码器需要做一些缓冲或者它返回字符数,而不是从讲?
字节有没有办法解决?
解决方案
如果为真,这听起来像编解码器模块的错误或限制,因为它可能是令人困惑的字节和字符偏移。
我会使用常规open()
功能打开的文件,然后seek()
/ tell()
会给你个字节,其始终保持一致的偏移。每当你想阅读,使用f.readline().decode('utf-8')
。
要小心的是,在使用该功能f.read()
可以土地在多字节字符的中间,由此产生的UTF-8解码错误。 readline()
将始终有效。
这并不透明地处理字节顺序标记你,但机会是你的日志文件没有BOM表反正。
其他提示
有关UTF-8,你实际上并不需要打开文件,codecs.open。相反,它是可靠的读取文件作为字节串第一,然后才进行解码的单个部分(调用对字符串.decode方法)。在行边界打破文件是安全的;唯一的不安全的方式来分割这将是在一个多字节字符(它可以从它的字节值> 128识别)的中间。
许多事情可以用Python UTF8推移有道理的,如果你看一下它是如何在Python 3做你的情况,如果你读潜水文件章成Python 3这会让相当多的感: http://diveintopython3.org/files.html
在短的话,虽然是用字节位置即file.seek
和file.tell
工作,而Unicode字符会占用多个字节。因此,如果你这样做:
f.seek(10)
f.read(1)
f.tell()
您可以轻松地获得比其他17
东西,这取决于你的长度读一个字符了。
更新:你不能这样做求/你能告诉()的返回codec.open的对象。你需要使用一个正常的文件,并解码字符串看完后为Unicode。
我不知道为什么它不工作,但我不能使它发挥作用。跳轨似乎只能使用一次,例如。然后,你需要关闭并重新打开该文件,这当然是没有用的。
在诉说不使用字符位置,但不告诉你在哪里你在流中的位置是(但可能其中基础文件对象是在从磁盘读取)。
所以,很可能是因为某种潜在的缓冲,你不能做到这一点。但deocding阅读的作品就好了,所以要为这一点。