如何在python中添加到TXT文件的顶部?
我有一个sql查询txt文件要附加到(顶部) 我要添加的项目来自此yml文件:如何在python中添加到TXT文件的顶部?,python,parsing,yaml,config,configparser,Python,Parsing,Yaml,Config,Configparser,我有一个sql查询txt文件要附加到(顶部) 我要添加的项目来自此yml文件: data: START_DT: '202001' END_DT: '202104' 我在python脚本中使用以下方法调用此yml文件: import yaml with open("data.yml", "r") as ymlfile: cfg = yaml.load(ymlfile) 我的sql文件的顶部是: set START_DT='20
data:
START_DT: '202001'
END_DT: '202104'
我在python脚本中使用以下方法调用此yml文件:
import yaml
with open("data.yml", "r") as ymlfile:
cfg = yaml.load(ymlfile)
我的sql文件的顶部是:
set START_DT='202001';
set END_DT='202104';
我想更改sql文件的顶部,以便在配置yaml文件中strt date和end date的内容将更改sql查询中start_dt和end_dt的值。在仅使用配置中的值时,如何替换每个变量(str date、end date)设置后的值
如果我无法替换START_DT之后的值,那么另一个选项是删除SET stations并使用config.yml变量从头重写,但是如果我使用这种方式,我如何生成日期字符串,以及如何将其附加到sql文件顶部或创建新的tmp文件
for k,v in cfg['data'].items():
print("SET" ,str(k)+':'+ v)
prints:
SET START_DT:201901
SET END_DT:202104
但是日期不在“”,我更喜欢:设置开始日期:'201901'。如果txtfile/sql文件无效,我也不确定如何将上面的打印语句附加到top
有什么建议吗?很简单:
- 您可以阅读YAML配置
- 将YAML中的第一行写入临时文件
- 从SQL文件中读取所有行
- 将所有行写入临时文件
- 删除旧文件
- 移动临时文件以替换SQL文件
import os
import yaml
# read the YAML configuration
with open("data.yml", "r") as ymlfile:
cfg = yaml.load(ymlfile)
# Create a temporary file
with open("data.tmp", "w") as tempfile:
# Write the lines from YAML
for k, v in cfg["data"].items():
tempfile.write(f"SET {k}='{v}';\n")
# Copy the contents of the old file ...
with open("data.sql") as oldfile:
for line in oldfile:
# ... as long as they haven't been set by YAML
set_by_yaml = False
for k, v in cfg["data"].items():
if line.startswith(f"SET {k}="):
set_by_yaml = True
if not set_by_yaml:
tempfile.write(line)
# Replace old file by new file
os.remove("data.sql")
os.rename("data.tmp", "data.sql")
这里,请注意,我们要写入的文件是“write_to.txt”(我们在开头也从中读取)。我们从“read_from.yaml”中获取必要的数据
谢谢大家! 采用从头重写的方法。很安全。不能在顶部追加。这将是预结束,不适用于文件。这就是为什么它被称为附加到文件。我是说,使用第二种方法,我不确定如何用我的打印状态附加到文件的顶部。它不是。对于k,v在cfg['data].items():以open('data.sql','a')作为f:f.write(('SET',k+':'+str(v)),不起作用。谢谢你,但是当我调用cfg['data']我正在考虑更动态地执行此操作,否则它会破坏首先执行此操作的目的。例如,对于cfg['data']中的k,v.items():print(“SET”,str(k)+':'+v)最好能给我所需的打印报表,但它不会保持日期的引号完整,这是我的问题having@Maths12:引号不是YAML中的值的一部分。因此您需要像我一样手动添加它们。我更改了代码以匹配您的k,v需要
import yaml
file = open('write_to.txt', 'r+')
temp_data = file.readlines()
with open('read_from.yaml') as f:
data = yaml.load(f, Loader=yaml.FullLoader)
data = data.get('data')
START_DT = str(data.get('START_DT'))
END_DT = str(data.get('END_DT'))
lines_of_interest = temp_data[:2]
rest_of_the_file = temp_data[2:]
ST_DT = lines_of_interest[0]
ST_DT = ST_DT.split('=')
ST_DT[1] = "'"+START_DT+"';\n"
lines_of_interest[0] = ''.join('=').join(ST_DT)
EN_DT = lines_of_interest[1]
EN_DT = EN_DT.split('=')
EN_DT[1] = "'"+END_DT+"';\n"
lines_of_interest[1] = ''.join('=').join(EN_DT)
lines = lines_of_interest + rest_of_the_file
file = open('write_to.txt', 'w+')
file.writelines(lines)