【问题标题】:Formatting string in python在python中格式化字符串
【发布时间】:2017-07-19 00:43:20
【问题描述】:

我想以表格格式写入文件,以下是我到目前为止编写的代码。

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。所以因此我无法连接字符串。 然后如何在 Check 旁边打印 _5?

【问题讨论】:

  • 在写出之前进行计算。你不能写出'Check '然后退格写出_5
  • @AChampion 不正确。可以使用'\b' 字符,即ASCII 字符代码8,字面意思是“退格”。这并不优雅,但有可能。
  • 这将取决于...文件将包含Check \b\b\b_5,它可能更多,也可能不起作用。显示该文件可能会显示正确的内容,但该文件仍包含额外字符,例如如果你用 python 读回它,你必须明确地处理\b\b\b

标签: python string file format


【解决方案1】:

在一个完美的世界里,你不会做以下答案中给出的事情。它很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

由于我们退格了两个字符,但只写了一个,原来的第二个字符仍然存在。您必须手动写入' ' 字符才能覆盖这些字符。

由于这个警告,当您添加'_5' 时,您可能不得不开始弄乱格式代码的长度(即'{0:12}' 可能需要变为'{0:5}' 或其他东西)。它会变得一团糟。

【讨论】:

  • 只是为了清楚文件包含Check \b\b\b_5 而不是Check_5,这可能不够,也可能不够。就个人而言,我会找到其他方法来做到这一点。
  • @AChampion 同意,这就是为什么我在顶部有一段说明这是一个坏主意,OP 应该首先尝试以正确的方式进行操作。
【解决方案2】:

问题是您为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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-28
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多