是否可以在不保存的情况下处理Django中的文件?

时间:2012-11-27 08:00:28

标签: python django

我正在使用pdftk处理PDF文件。

new_doc.save()
url = "/docs/" +settings.MEDIA_URL + new_doc.pdf_file.name
command = 'pdftk '+url+" dump_data_fields" 

问题是我必须在new_doc.save之前使用pdftk

有没有办法让pdftk在不保存的情况下处理文件?

2 个答案:

答案 0 :(得分:1)

subprocess.Popen()subprocess.PIPE一起用作stdinstdout参数。由于pdftk可以从stdin获取输入,因此您可以将文件“直接”写入pdftk而不是文件系统:

import subprocess

command = ['pdftk', '-', 'dump_data_fields']
p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
output, errorout = p.communicate(input=new_doc_data)

Popen.communicate() method会同时返回stdoutstderr个结果。

请注意,input的{​​{1}}参数必须是字符串。如果.communicate()是某种文件对象,则必须传入new_doc或类似的结果;在上面的示例中,我使用变量名new_doc.read()来表示您将new_doc_data中的数据作为字符串传递,因为我不知道您可以在这些对象上使用哪种API。

答案 1 :(得分:-1)

您最好的选择是使用StringIO

我假设在某些时候new_doc来自模板,它是某种文本。在这种情况下,你可以做这样的事情。

from StringIO import StringIO
new_doc = 'foobar'
doc = StringIO(new_doc)
doc.seek(0)
doc.read()

输出将是'foobar'

第一行导入StringIO(对于更快的版本,请执行从cStringIO导入StringIO)。然后我们创建一个字符串并用它实例化一个StringIO对象。从那里它非常像一个