使用Python在字符串中创建一个tar文件

3
我需要生成一个tar文件,但是作为内存中的字符串而不是实际文件。我的输入是单个文件名和包含相关内容的字符串。我正在寻找可以使用的Python库,以避免自己编写代码。
一些更多的工作发现了 这些函数,但使用内存流对象似乎有点...不太优雅。而且让它从字符串中接受输入看起来更加...不太优雅。但是它能够工作。我假设,因为大部分对我来说都是新的。有人发现其中有任何错误吗?

如果有什么不同意见的话,大多数人都会认为使用现有的tarfile模块并将字符串视为流的解决方案是一种优雅的解决方案。你肯定不认为实现一个完全不同的仅适用于字符串的tar实现更加优雅吧? - HS.
@HS:正如我在其他地方指出的那样,这感觉就像用石头敲钉子一样:是的,它能工作。而且,我也可以用石头压住防水布。但是,我宁愿使用锤子,即使这意味着要多带一些重量。回到这个主题上来,你甚至可以通过使用命名管道来避免需要将文件对象传递给某些东西,就像bash使用<()一样,那么为什么Python有一个cStringIO对象呢? - BCS
我正在测试使用StringIO的TarFile,但它仍然将/tmp作为临时目录,这并不是严格的内存操作。 - jjmontes
1个回答

15

使用 tarfile 结合 cStringIO

c = cStringIO.StringIO()
t = tarfile.open(mode='w', fileobj=c)
# here: do your work on t, then...:
s = c.getvalue()   # extract the bytestring you need

似乎是一个有点勉强的解决方案。它能够工作,但似乎应该有更好的方法。 - BCS
1
@BCS,将其视为模块化组合:通常处理文件的每个工具都应该能够接受类似于文件的“对象”,而cStringIO可以向它们中的每一个提供内存中的文件类似对象,就像urrlib2.urlopen可以从URL提供(只读)文件类似对象一样。N个处理文件的工具,M种制作文件对象的方法->您以代价成本仅为N + M获得所有N * M种可能性。有人发明了一种新的制作文件对象的方法,砰,已经与所有现有的N个工具兼容,“免费”!没有比模块化更好的方法了。 - Alex Martelli
@carl:tarfile有多大?我不是在谈论我编写的代码,而是我使用的额外代码。 - BCS
@Alex M. 我想到的解决方案将会是 SomeFormatString % (filename, len(data), const + sum(filename) + sum("%d"%len(data)), data)。稍微可读性更好/更正确的版本将会是 ~3行代码,且不使用核心语言之外的任何东西。 - BCS
1
@BCS,那段代码并没有“在内存中生成tar文件”——最多只是将一个“带有文件名的数据”格式化到任意文件中(而且在应用程序逻辑的中心位置硬编码了关于tar标准的细节,这是最糟糕的地方——特别是考虑到这些知识已经在Python中重复出现,谁会关心它是否“在核心语言”中?标准库和任何其他部分一样“核心”。此外,由于使用字符串参数调用sum函数将引发异常。呕!-) - Alex Martelli
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接