如何在python中添加到TXT文件的顶部?

如何在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

我有一个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='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)