【问题标题】:In Python, how to write back a stringIO text file to a zip archive, then back to bytea field in PostgreSQL?在 Python 中,如何将 stringIO 文本文件写回 zip 存档,然后再写回 PostgreSQL 中的 bytea 字段?
【发布时间】:2011-10-03 21:18:41
【问题描述】:

一个相对 Python 的菜鸟,我已经成功地从一个 zip 存档中提取了一个文本文件,它包含在 PostgreSQL bytea 字段中,使用以下代码:

myzip = ZipFile(StringIO(rv[0]["archivefield"]), 'a')
data = myzip.read("content.txt",'a')

# *** WORK ON content.txt HAPPENS HERE ***

然后我已经完成了该文本文件所需的工作......到目前为止,一切都很好!

不过,现在对于将 content.txt 压缩回存档中的正确位置,然后写回“archivefield”的语法有点困惑。

这里的任何专家可以建议我需要的一点语法吗?快到了!

嗯,感谢这里收到的帮助 - 我们现在肯定会回信到“存档域” - 这太棒了!

现在的问题是:

1) 我显然将原始字段的大小增加了一倍。这是“附加”模式的功能吗?如何“回到零并重写该字段? - 和/或 -

2) 我写回的数据不会像原始数据那样编码回十六进制(?)模式 - 并且将是 PostgreSQL v9 的标准。 - 或者 -

问题是数据没有被再次压缩,因此它的体积很大吗?

【问题讨论】:

标签: python zipfile stringio plpython


【解决方案1】:

使用ZipFile.writestr:

strf = StringIO(rv[0]["archivefield"])
zipf = ZipFile(strf, "a")
data = myzip.read("content.txt"')

# process data, changing its value

zipf.writestr("content.txt", data)
zipf.close()  # actually write contents out

然后将str.getvalue() 写回您的PostgreSQL 数据库,覆盖rv[0]["archivefield"] 的先前值。恐怕我帮不了你。

【讨论】:

  • larsmans - 是的,感谢您的评论 - 现场。我的数据在内存中,所以在尝试将其作为流处理与作为文件处理之间有点挣扎!很快就会尝试你的建议。 @S.Lott:cmets 的 Tks;是的,我已经按照您的建议尝试了两种形式的 ZipFile write(str)。正如 larsmans 指出的那样,似乎都不适合我的情况。
猜你喜欢
  • 1970-01-01
  • 2016-06-15
  • 2012-08-02
  • 2017-11-14
  • 2013-12-26
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多