【问题标题】:Inexpensive ways to add seek to a filetype object向文件类型对象添加搜索的廉价方法
【发布时间】:2010-04-16 12:59:42
【问题描述】:

PdfFileReader 从 pdf 文件中读取内容以创建对象。

我正在通过urllib.urlopen() 从 CDN 查询 pdf,这为我提供了一个类似对象的文件,它没有搜索。 PdfFileReader,但是使用 seek。

从通过 url 下载的 pdf 创建 PdfFileReader 对象的简单方法是什么。

现在,我该怎么做才能避免写入磁盘并通过file() 再次读取它。

提前致谢。

【问题讨论】:

  • 请注意,如果您确实将其保存到磁盘并打开它,您应该使用open,而不是file
  • 迈克:PdfFileReader(file('aaa.pdf')) 工作正常。
  • 是的,但最好使用open() 而不是file() - 它们采用相同的参数。请参阅docs.python.org/library/functions.html#file 处的说明

标签: python file urllib file-type


【解决方案1】:

实际上并没有一种廉价、即用的方式来做到这一点。最简单的方法是读取所有数据并将其放入StringIO 对象中。但是,这确实需要您先阅读所有内容,这可能是您想要的,也可能不是。

如果您想要只在必要时读取的内容,然后存储已读取的内容(或者可能只是已读取的部分内容),那么您必须自己编写。您可能希望查看 StringIO 模块(或 Python 2.6 中的 io 模块)的源代码以获取一些示例。

【讨论】:

  • 不,不,不。它不是 100 MB 的文件。我只想要一些有用的东西。如果可能的话,便宜。不是通过编写 IO 模块。 :)
  • 所以使用第一个建议:StringIO 是你的朋友。
【解决方案2】:

您可以使用.read() 方法读取文件的全部数据,然后创建您自己的类似文件的对象(很可能通过StringIO)来提供对它的访问。

【讨论】:

  • 我也不能file(urllib.urlopen('abc.pdf').read())。我得到“TypeError:file() 参数 1 必须是没有 NULL 字节的编码字符串,而不是 str”
  • file() 不是像 dict()list() 这样的转换函数 - 它实际上采用与 open() 相同的参数(文件名和可选模式 + 缓冲区大小)。您不能只传递文件内容并获取文件对象。
【解决方案3】:

我怀疑您可能在这里过早优化。

大多数现代系统会在将文件刷新到磁盘之前将文件缓存在内存中很长一段时间,因此如果您将数据写入临时文件,将其读回,然后关闭并删除该文件,您可能会发现没有显着的磁盘流量(除非它真的是 100MB)。

您可能想查看使用 tempfile.TemporaryFile() 创建一个在关闭时自动删除的临时文件,或者使用 tempfile.SpooledTemporaryFile() 将其全部保存在内存中直到超过特定大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多