如何修改sql文件中的特定行?

时间:2019-03-20 19:43:49

标签: python os.walk

我正在尝试修改目录中sql文件中的一行。 目前已经编写了根据用户输入导航到文件目录的代码。

该目录中的每个sql文件都有以下两行:

--liquibase formatted sql
--changeset Jack:1 runOnChange:true splitStatements:false stripComments:false

我想做的是遍历所有文件,并且每次脚本运行时我都要更改设置。

所以这两行看起来像这样:

 --liquibase formatted sql
 --changeset Ryan:2 runOnChange:true splitStatements:false stripComments:false

我要在行中更改的部分是恒定的,但每个文件的内容都不同,就像在其他文件中一样,它将是Jie:6,我想用Priyal:7代替。因此,名称部分是运行脚本的人,并且:之后的数字递增

有没有更清洁的方法来实现这一目标:

这只是我配置路径和所有内容的示例代码:

anbpath = os.path.abspath("copy_views.py")
 print(anbpath)

sqldir = os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'database')) 

path_to_views = sqldir+"/sql/edm/changes/"+source_release_version+"/mutable/view"
print(path_to_views)


destdir = os.path.abspath(os.path.join(os.path.dirname( __file__ ),'..', 'database')) 

path_to_dest_rel_ver = destdir+"/sql/edm/changes/"+dest_release_version

path_to_dest = path_to_dest_rel_ver+"/mutable/view"

我将使用path_to_dest遍历os.walk中的所有文件

3 个答案:

答案 0 :(得分:0)

您可以使用正则表达式解决此问题: 如果找到正确的序列,下面的代码会将字符串“ name1:1”替换为“ name2:2”,并保留该行的其余部分:

import re

# read the file, line by line and then:
line_fixed = re.sub(r"(--changeset )name1:1(.*)", r"\1name2:2\2", line)
# then save the fixed line to a temporary file until you read all file

答案 1 :(得分:0)

如果您的文件名为“ file.txt”,并且name不变,那么您要查找的是

# Read the contents of file
with open("file.txt", 'r') as fp:
    lines = fp.readlines()

#Idendify tokens and numbers with in them and increment them
words = lines[1].split()
tokens = words[1].split(":")
words[1] = "name{0}:{1}".format(int(tokens[0][4:])+1, int(tokens[1])+1)
lines[1] = ' '.join(words)

# Write back the updated lines
with open("file.txt", 'w') as fp:
    fp.writelines(lines)

文件的初始内容

"--liquibase formatted sql", "--changeset name3:21 runOnChange:true splitStatements:false stripComments:false"]

修改后

"--liquibase formatted sql", "--changeset name4:22 runOnChange:true splitStatements:false stripComments:false"]

但是,如果name不是常数,那么我们仍然可以在“:”处分割标记以标识“:”之后的数字,但是要标识以名称结尾的数字,我们将必须使用正则表达式。

答案 2 :(得分:0)

这是使用正则表达式的一种方法:

import re

lines = [
    "--liquibase formatted sql",
    "--changeset Jack:2 runOnChange:true splitStatements:false stripComments:false",
    "--liquibase formatted sql",
    "--changeset Ryan:6 runOnChange:true splitStatements:false stripComments:false",
#   etc ...
]

def update_line(line):
    p = re.compile(r'--changeset (.+):(\d+) runOnChange')
    matches = p.match(line)
    if not matches:
        return line
    else:
        replacement = '--changeset {}:{} runOnChange'.format(matches.group(1),
                                                             int(matches.group(2))+1)
        return p.sub(replacement, line)

for line in lines:
    updated_line = update_line(line)
    print(repr(updated_line))

输出:

'--liquibase formatted sql'
'--changeset Jack:3 runOnChange:true splitStatements:false stripComments:false'
'--liquibase formatted sql'
'--changeset Ryan:7 runOnChange:true splitStatements:false stripComments:false'