【问题标题】:How can i add to top of a txtfile in python?如何在 python 中添加到文本文件的顶部?
【发布时间】:2021-06-02 10:51:16
【问题描述】:

我有一个 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 日期和结束日期的任何内容都会更改 sql 查询中 start_dt、end_dt 的值。如何在仅使用配置中的值的同时替换每个变量(str 日期、结束日期)的 SET 之后的值?

如果我无法替换 START_DT 之后的值,那么另一种选择是删除 SET 语句并使用 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 

但日期不在“'”中,我更喜欢:SET START_DT:'201901'。同样,如果是 txtfile/sql 文件,我不确定如何将上述打印语句附加到顶部。

有什么建议吗?

【问题讨论】:

  • 采用从头开始重写的方法。它是安全的。您不能在顶部附加。那将是 prepend 并且不适用于文件。这就是为什么它被称为 append 到文件。
  • 我说的是第二种方法,我不确定如何用我的打印数据附加到文件的顶部
  • 不,它没有。
  • for k,v in cfg['data].items(): with open ('data.sql', 'a') as f: f.write(("SET" ,k+' :'+ str(v)) 不起作用

标签: python parsing yaml config configparser


【解决方案1】:

这真的很简单:

  • 您阅读了 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")

【讨论】:

  • 谢谢你,但是当我调用 cfg["data"] 时,我正在考虑更动态地执行它,否则它会破坏首先打扰这样做的目的。例如for k,v in cfg['data'].items(): print("SET" ,str(k)+':'+ v) 理想情况下会给我所需的打印语句,但它不保留引号日期完好无损,这是我遇到的问题
  • @Maths12:引号不是 YAML 中值的一部分。所以你需要像我一样手动添加它们。我更改了代码以匹配您的 k,v 需求
【解决方案2】:
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)

在这里,请注意我们正在写入的文件是“write_to.txt”(我们在开始时也从中读取)。我们从'read_from.yaml'中获取必要的数据

谢谢!

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2013-02-04
    相关资源
    最近更新 更多