Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以在Django中处理文件而不保存它?_Python_Django - Fatal编程技术网

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对象。从这里开始,它非常类似于使用as
stdin
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()
方法,请参阅