【问题标题】:Compressing strings and appending to file on the fly动态压缩字符串并附加到文件
【发布时间】:2015-04-25 15:44:33
【问题描述】:

我目前有以下 csv writer 类:

class csvwriter():
    writer = None
    writehandler = None
    @classmethod
    def open(cls,file):
        cls.writehandler = open(file,'wb')
        cls.writer = csv.writer(cls.writehandler, delimiter=',',quotechar='"', quoting=csv.QUOTE_NONNUMERIC)

    @classmethod
    def write(cls,arr):
        cls.writer.writerow(arr)

    @classmethod
    def close(cls):
        cls.writehandler.close()

它可以生成正确的 csv 文件,而不必一次将整个数组存储在内存中。

但是,通过使用此代码创建的文件可能非常大,因此我希望压缩它们,而不是未压缩地编写它们。 (为了节省磁盘使用量)。我也无法有效地将文件存储在内存中,因为我预计超过 20gb 的文件会经常出现。

结果文件的接收者通常不是他们 PC 的系统管理员,他们也不都使用 linux,所以我受限于我能够用于此任务的算法类型。最好,该解决方案将使用在 Windows、OSX 和任何 linux 发行版中本机可读(不需要可执行文件)的压缩方案。

我发现 gzip 在 Python 中提供了一个非常方便的界面,但在 Windows 中读取 gzip 文件似乎很麻烦。理想情况下,我会将它们放在一个 zip 存档中,但 zip 存档不允许您附加将数据复制到存档中已经存在的文件中,然后迫使我将整个文件存储在内存中,或者将数据写入我能够放入内存中的几个较小的文件中。

我的问题:有没有一种可以两全其美的解决方案?在最终用户的机器上读取目标格式的工具的广泛可用性,以及追加而不是一次性写入整个文件的能力?

提前感谢您的考虑!

【问题讨论】:

  • 为什么您认为必须将所有数据存储在内存中才能写入?使用类来做你正在做的事情也没有多大意义
  • 嗨 Padraic,关于课程的观点很公平。我偶然注意到我的代码包含 gzip.open 函数,我打算提供没有压缩的幼稚版本。 Gzip 是可用的,但非 Linux 用户很难解压缩(需要可执行文件,我的最终用户可能不一定有权访问)。
  • 我找到了以下博客文章 - swl10.blogspot.nl/2012/12/… - 我会尝试看看这是否是一条富有成效的道路。
  • 有一个 lib 可以跨平台使用 zip 文件,如果我能想到名称,我会告诉你。您基本上可以模仿他们正在为您工作的工作。
  • 我以后会有一个根,前段时间我在找相关的东西时看到了它。

标签: python python-2.7 csv zip gzip


【解决方案1】:

gzlog 可能会提供您正在寻找的功能。它有效地将短字符串附加到 gzip 文件中,适用于将短消息附加到长日志的应用程序。

【讨论】:

  • 嗨,马克,感谢您的建议!我正在尝试为可能在 Windows 机器上工作并且没有安装软件的管理员权限的最终用户压缩文件。因此,我认为 gzip 不是一个好主意,但如果我错了,请纠正我!
  • 您可以使用相同的技术附加到单项 zip 文件。 zip 和 gzip 都使用 deflate 压缩数据格式。
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多