gpt4 book ai didi

python - 如何在使用 python 的 Linux 中使用 “difflib” 命令获取字符级别差异?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:27 24 4
gpt4 key购买 nike

我有两个SQL文件,一个是old.sql,一个是new.sql。

假设old.sql中有一张表,表中有Emp_Id、Name和Address三个字段,old.sql中存储的数据如下:

Insert into table1 values (101 ,"a", "xyz");
Insert into table1 values (102 ,"b", "pqr");

然后我将“a”地址“xyz”更改为“xyz123”并将该数据保存在 new.sql 文件中。现在new.sql文件包含如下数据:

Insert into table1 values (101 ,"a", "xyz123");
Insert into table1 values (102 ,"b", "pqr");

当我像这样使用 difflib 命令时:

difflib old.sql new.sql

它给出了逐行差异,但我只想要更新的数据,比如 xyz123

最佳答案

问题是 diff 不知道您将行的哪一部分定义为“数据”,将什么定义为“语法”。如果你进行逐行差异,你会得到 123"); 是不同的部分。

Insert into table1 values (101 ,"a", "xyz");
Insert into table1 values (101 ,"a", "xyz123");
123"); <-- difference

因此您需要实际解析每个不同的行,使用一个知道将什么解释为语法以及将什么解释为实际数据的脚本。

由于您的数据文件很大,您可以在 Python 中同时打开这两个文件,并分别读入一行并进行比较。

fh1 = open('file1.sql', 'r')
fh2 = open('file2.sql', 'r')

while True:
line1 = fh1.readline() or break;
line2 = fh2.readline() or break;
check_difference(line1, line2)

close(fh1)
close(fh2)

检查详细差异将取决于您文件的语法。

def check_difference(line1, line2):
if line1 == line2:
return None

# Get a list with the cleaned up data fields.
data1 = get_values_list(line1)
data2 = get_values_list(line2)

# Compare each individual field.
for i in range(len(data1)):
if data1[i] != data2[i]:
print('Difference: {} --> {}'.format(data1[i], data2[i]))

def get_values_list(s):
# Split a line into data fields and remove quotes, etc.
li = s[s.index('(') + 1 : s.index(')')].split(',')
return [x.strip(' ').strip('"\'') for x in li]

那是未经测试的,但基本上应该可以很好地进行比较。它不会读取整个文件,只会返回发生变化的单个数据字段。

关于python - 如何在使用 python 的 Linux 中使用 “difflib” 命令获取字符级别差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37587935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com