我有产生一些大的日志文件的应用程序> 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.seekfile.tell工作,而Unicode字符会占用多个字节。因此,如果你这样做:

f.seek(10)
f.read(1)
f.tell()

您可以轻松地获得比其他17东西,这取决于你的长度读一个字符了。

更新:你不能这样做求/你能告诉()的返回codec.open的对象。你需要使用一个正常的文件,并解码字符串看完后为Unicode。

我不知道为什么它不工作,但我不能使它发挥作用。跳轨似乎只能使用一次,例如。然后,你需要关闭并重新打开该文件,这当然是没有用的。

在诉说不使用字符位置,但不告诉你在哪里你在流中的位置是(但可能其中基础文件对象是在从磁盘读取)。

所以,很可能是因为某种潜在的缓冲,你不能做到这一点。但deocding阅读的作品就好了,所以要为这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top