Python 是否可以在Django中处理文件而不保存它?
我正在使用Python 是否可以在Django中处理文件而不保存它?,python,django,Python,Django,我正在使用pdftk处理PDF文件 new_doc.save() url = "/docs/" +settings.MEDIA_URL + new_doc.pdf_file.name command = 'pdftk '+url+" dump_data_fields" 问题是我必须在pdftk之前使用new\u doc.save 有没有办法让pdftk在不保存文件的情况下处理该文件?您最好的选择是使用StringIO 我假设在某一点上,新的文档来自一个模板,它是某种文本。在这种情况下,你可以
pdftk
处理PDF文件
new_doc.save()
url = "/docs/" +settings.MEDIA_URL + new_doc.pdf_file.name
command = 'pdftk '+url+" dump_data_fields"
问题是我必须在pdftk
之前使用new\u doc.save
有没有办法让
pdftk
在不保存文件的情况下处理该文件?您最好的选择是使用StringIO
我假设在某一点上,新的文档来自一个模板,它是某种文本。在这种情况下,你可以这样做
from StringIO import StringIO
new_doc = 'foobar'
doc = StringIO(new_doc)
doc.seek(0)
doc.read()
输出将为“foobar”
第一行导入StringIO(对于更快的版本,请从cStringIO导入StringIO)。然后我们创建一个字符串并用它实例化一个StringIO对象。从这里开始,它非常类似于使用asstdin
和stdout
参数。由于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)
返回stdout
和stderr
结果
请注意,
.communicate()
的输入
参数必须是字符串。如果new\u doc
是某种文件对象,则必须传入new\u doc.read()
或类似的结果;在上面的示例中,我使用变量名new\u doc\u data
表示您将new\u doc
中的数据作为字符串传递,因为我不知道您可以在这些对象上使用什么API。pdftk
在stdin上输入文件名为-
,因此这是完全可能的,提供的新文档可以流式传输。您对使用子流程
管道有多满意?我已经准备好学习新的东西了,所以请告诉我您想说什么。我会尝试,这根本不能解决OP的问题。这将如何发送到pdftk
(一个外部命令)?我同意,现在我知道了pdftk是一个外部命令这一小部分信息。可能这个问题需要更新来说明这一点?我想这已经足够清楚了。这个问题在细节上有点含糊不清,但命令
变量只是一个提示,我查阅了pdftk
命令,查看它是否使用了stdin数据而不是之前的输入文件(请参见我在问题下面的评论)。@Martjin Pieters。它可以通过HttpResponse发送!阅读文档。我在我的django项目中这样做了,而且很有效!我正在使用django表单上传文件,在使用myobject.save保存文件之前,我想对字段执行一些验证。如果这是有效的,那么我想保存到我想要的位置。我不知道如何获取新的文档数据,因为当django表单提交时,我不知道文件的位置在哪里saved@user32:上载的文件具有.read()
方法,请参阅