2017-07-19 104 views
1

我想以表格格式写入文件,以下是我至今编写的代码。在python中格式化字符串

file_out=open("testing_string","w") 
file_out.write("{0:<12} {1:<20} {2:<30}\n".format("TUPLE","LOGFILE STATUS","FSDB STATUS")) 
file_out.write("{0:12}".format("Check")) 
file_out.write("{0:12}".format("_5")) 
file_out.close() 

Testing_string看起来像这样。

TUPLE  LOGFILE STATUS  FSDB STATUS     
Check  _5  

问题是我想_5与检查。请参阅我不能连接检查和_5,因为检查首先在文件中打印,然后根据某些逻辑填充LOGFILE STATUS FSDB STATUS。如果我无法填写状态,那么我检查是否必须追加_5或不。所以由于这个原因我不能连接字符串。 如何在检查旁边打印_5?

+0

在你写出来之前进行计算。你不能写出''Check'',然后退格去写出'_5'。 – AChampion

+0

@AChampion不正确。可以使用''\ b''字符,即[ASCII](http://www.asciitable.com/)字符代码8,字面意思是“backspace”。这不是优雅,但它是可能的。 – SethMMorton

+0

这将取决于...该文件将包含“Check \ b \ b \ b_5”,这可能更多或可能无效。显示该文件可能显示正确的文件,但该文件仍然包含额外的字符,例如如果你要用python读取它,你必须明确地处理'\ b \ b \ b'。 – AChampion

回答

1

问题是您要为Check指定12个字符。试试这个:

file_out=open("testing_string","w") 
file_out.write("{0:<12} {1:<20} {2:<30}\n".format("TUPLE","LOGFILE STATUS","FSDB STATUS")) 
file_out.write("{0:5}".format("Check")) 
file_out.write("{0:7}".format("_5")) 
file_out.close() 
2

在一个完美的世界里,你不会去做下面的答案。这是hacky和容易出错,真的很奇怪。在一个完美的世界里,你会想出如何在之前写出你想要的东西,你实际写入磁盘。我认为你甚至考虑到这一点的唯一原因是你正在维护一些陈旧和易怒的遗留代码,并且不能“以正确的方式”做事。


这不是最优雅的答案,但您可以使用退格字符覆盖先前写入的内容。

with open('test.txt', 'w') as file_out: 
    file_out.write("{0:<12} {1:<20} {2:<30}\n".format("TUPLE","LOGFILE STATUS","FSDB STATUS")) 
    file_out.write("{0:12}".format("Check")) 
    backup_amount = 12 - len("Check") 
    file_out.write("\b" * backup_amount) 
    file_out.write("{0:12}".format("_5")) 

输出:

TUPLE  LOGFILE STATUS  FSDB STATUS     
Check_5 

在这种特殊情况下,因为我们完全覆盖与新角色之前写入字符这仅适用于 - 退格几乎备份光标,但实际上并没有覆盖以前书面数据。注意:

with open('test.txt', 'w') as f: 
    f.write('hello') 
    f.write('\b\b') 
    f.write('p') 

输出:

helpo 

因为我们退格两个字符,但只写了一个,原来的第二个字符仍然存在。您将不得不手动编写' '字符来覆盖这些字符。

因为这个警告的,你可能会开始与格式代码的长度搞乱(即'{0:12}'可能需要成为'{0:5}'或别的东西)当您添加'_5'。它会变得混乱。

+0

只是为了清楚该文件包含'Check \ b \ b \ b_5'而不是'Check_5',这可能会或可能不足够。就我个人而言,我会找到其他方式来做到这一点。 – AChampion

+0

@AChampion同意,这就是为什么我在顶部有一段说明这是一个坏主意,OP应该尝试以正确的方式做到这一点。 – SethMMorton