Python 如何返回具有精确位置的文本文件?
我正在用Django创建一个文本文件响应。我用一个模板文件来实现它Python 如何返回具有精确位置的文本文件?,python,django,text,file-io,Python,Django,Text,File Io,我正在用Django创建一个文本文件响应。我用一个模板文件来实现它 def create_file(request): ... create context ... result = render_to_string('template.txt', context_dict) response = HttpResponse(result, mimetype='text/plain') response['Content-Disposition'] = 'atta
def create_file(request):
... create context ...
result = render_to_string('template.txt', context_dict)
response = HttpResponse(result, mimetype='text/plain')
response['Content-Disposition'] = 'attachment; filename=file.txt'
return response
但是文本文件响应是唯一的,因为文件中的每个字符都必须精确定位。因此,文件中的每个字符(包括空格)都是故意放置的。这对于带有未指定长度的变量的行来说是一个问题。假设我们有两个变量,它们是字符串,并且在模板中位于同一行
{{variable1}} {{variable2}}
和variable2必须出现在文本文件的第5列中。如果我不知道variable1占用了多少空间,如何为variable2指定一个精确的位置?或者,我完全错了吗?完全抛弃模板并在视图中创建文本响应是否更容易?是的,完全在视图中创建响应更容易。模板只是一个方便的插件,用于使用静态支架呈现结构化文本,但在我看来,您的结构似乎在布局中,而不是支架中
事实上,我会通过创建自己的小模板引擎来处理这一特殊情况。Django有很多这样做的例子,可以输出CSV、PDF,甚至是Django应用程序生成的图像。正如您所建议的,我会在视图中这样做 对于您给出的示例,可以使用左对齐字符串,根据需要填充空格
>>> from string import ljust
>>> variable1 = "v1"
>>> variable2 = "v2"
>>> ljust(variable1, 4)
'v1 '
>>> line = "%s%s" % (ljust(variable1, 4), variable2)
'v1 v2'
或者,正如Elf和ΖΖΖΖΖΖΖΥ在评论中指出的那样,您可以使用%-格式设置
>>> from string import ljust
>>> variable1 = "v1"
>>> variable2 = "v2"
>>> line = "%-4s%s" % (variable1, variable2)
'v1 v2'
使用.4
将变量1
截断为4个字符:
>>> variable1 = "12345"
>>> variable2 = "v2"
>>> line = "%-4s.4%s" % (variable1, variable2)
'v1 v2'
(即将过时)sprintf
-like%
格式具有以下功能:
"%6.6s" % variable # right-justify at most 6 characters prefixing spaces as needed
"%-6.6s" % variable # left-justify at most 6 characters appending spaces as needed
"%-*.*s" % (width, width, variable) # left-justify at most width characters
但是,我不知道您的模板机制是如何实现的,它是否可以使用
%
格式。正确的对齐更容易。(%06s“%variable1”)将在字符串的左侧放置6-len空格。(不过,如果需要的话,它不会被截断为6个字符。)感谢您的回复。使用ljust看起来比使用模板更有希望。现在我需要考虑一个代码结构来处理我正在创建的行的每种情况(确切地说是62:-()不管怎样,你都必须这样做,不是吗?即使模板做了你想要的,你仍然必须精确地描述每一行,就像网页精确地描述每个DIV、SPAN和TABLE/TR/TD一样。描述结构,然后编写代码将其与数据合并。然后编写代码使结构可插入.Oh当然。事实上,这种方法会更简单,因为我可以用循环来实现它,而不是显式地布置每一行。@Elf:要左对齐最多6个字符,您需要“%-6.6s”%variable
),而要右对齐,您需要“%6.6s”%variable
)。“%06s”用零填充。