我想以自定义表格式将一些变量打印到文件中,并且能够添加到表中,而无需再次添加标题并保留以前的信息。下面是我的代码:
import time as r
data = r.strftime("%d %m %Y %I %M")
with open('myfile.txt','a') as f:
f.write(data + 'n')
文本文件中的输出:
01 07 2022 01 19
现在是我想要的输出:
_________________________________
|Day |Month |Year |Hour |Minute |
|-------------------------------|
|01 |07 |2022 |01 |19 |
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|
我想要有这样的能力,如果我再次运行这个文件,它会添加新的输出它看起来像这样:
_________________________________
|Day |Month |Year |Hour |Minute |
|-------------------------------|
|01 |07 |2022 |01 |19 |
|===============================|
|01 |07 |2022 |02 |10 |
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|
我知道这是一个荒谬的帖子,但有人知道怎么做吗?谢谢。
对fun
函数的第一次调用将创建标题,添加第一个数据并将结束行填充为'^'*31。为了确保它确实是第一次调用,并且在每个后续调用中不重新创建头,这里有if
块。
当第一个调用以读取模式'r'
打开time.txt
时,所有其他调用以'r+'
模式打开它,该模式打开文件进行读写。当读取文件并将其中的所有内容保存到saved
时(除了结束行之外的所有内容),解析器的光标被移动到打开的文件的开头,以便可以用带有末尾结束行的新数据重写文件。
def fun():
import time
import os.path
seperator='|'+'-'*31+'|n'
end = '|'+'^'*31+'|'
if not os.path.isfile('time.txt'): #checking if the file exist
with open('time.txt','w') as f:
header= '_'*32+'n'+
'|Day |Month |Year |Hour |Minute |n'
t=time.localtime()
data = (f'|{t[2]:<4}|{t[1]:<6}|{t[0]:<5}'
f'|{t[3]:<5}|{t[4]:<7}|n')
f.write(header+seperator+data+end)
else:
with open('time.txt','r+') as f:
saved=f.readlines()[:-1] #saving all, but the end line
f.seek(0) #set the cursor to the start of the file
t=time.localtime()
data = (f'|{t[2]:<4}|{t[1]:<6}|{t[0]:<5}'
f'|{t[3]:<5}|{t[4]:<7}|n')
f.writelines(saved+[seperator,data,end])
它可能不是满足你需要的理想选择…我不敢说代码是完美无缺的。
注意:如果'time.txt'已经存在,但为空或/and没有头文件,则不会创建头文件。
给你两个答案…
- 使用Pypi为打印表格设计的库
- 使用字符串格式自己构建
我强烈推荐第一个,因为使用库比构建定制函数更容易获得几乎相同的结果。有些是我过去用过的,可以推荐:
- https://pypi.org/project/prettytable/
- https://pypi.org/project/tabulate/
检查项目,看看是否有你可以使用的东西。
对于第二个选项,您可以通过巧妙地使用填充来自己构建。
这里有一个教程->https://www.geeksforgeeks.org/add-padding-to-a-string-in-python/
我说要聪明点,因为如果你想保持对称,你必须找到长度最长的字符串
使用基本的字符串打印和字符串格式化可以得到结果。
首先,正如您所做的那样,您必须在文件中插入新的日期:
import time as r
data = r.strftime("%d %m %Y %I %M")
with open('myfile.txt','a') as f:
f.write(data + 'n')
然后,你必须得到你在文件中注册的所有日期:
with open('myfile.txt', 'r') as file:
data = file.readlines()
data = [string[:-1] for string in data] # To delete the 'n'
最后是打印部分,使用for循环获取所有元素:
print('_________________________________')
print('|Day |Month |Year |Hour |Minute |')
print('|-------------------------------|')
for elements in data:
element = elements.split()
print(f'|{element[0]} |{element[1]} |{element[2]} |{element[3]} |
{element[4]} |')
if elements != data[-1]:
print("|===============================|")
else:
print("|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|")
注意:您可以使用Pypi官方文档
中的pprint: pprint描述等库您可以使用表格库。