替换文件

时间:2017-04-21 14:13:30

标签: python search replace hex

我想在.sql文件中用十进制等效替换所有十六进制。

我有数十万行像这样:

INSERT INTO TEST (TEST_ID, VEHICLE_ID, TEST_TYPE_ID, TYPE_ID, NUM_TEST, TEST_DATE, HOUR_START, HOUR_END, ....) VALUES (844, 504, 3, 1, 3, CAST(0x0000991400000000 AS DateTime), CAST(0x00009914008FC76C AS DateTime), CAST(0x0000991400906924 AS DateTime), ......);

我想使用这个sql文件来创建一个SQLite数据库。但SQLite并不认识十六进制。所以目标是替换文件的所有十六进制。

我找到了这个替换特定十六进制的解决方案:

decimal = int("0x0000991400000000", 0)

我发现这个解决方案可以用另一个单词取代所有出现的单词:

for line in fileinput.input():
line = re.sub('wordToReplace','newWord', line.rstrip())

我尝试使用第二个中的第一个,但是新的'正在考虑一个字符串,我给了一个int。什么可以做我想要的方式?

感谢您的时间!

1 个答案:

答案 0 :(得分:3)

使用带有正则表达式的替换函数:

import re

data = "INSERT INTO TEST (TEST_ID, VEHICLE_ID, TEST_TYPE_ID, TYPE_ID, NUM_TEST, TEST_DATE, HOUR_START, HOUR_END, ....) VALUES (844, 504, 3, 1, 3, CAST(0x0000991400000000 AS DateTime), CAST(0x00009914008FC76C AS DateTime), CAST(0x0000991400906924 AS DateTime), ......);"

data_dec = re.sub("(0x[\dA-F]+)",lambda m : str(int(m.group(1),16)),data)

print(data_dec)

结果:

INSERT INTO TEST (TEST_ID, VEHICLE_ID, TEST_TYPE_ID, TYPE_ID, NUM_TEST, TEST_DATE, HOUR_START, HOUR_END, ....) VALUES (844, 504, 3, 1, 3, CAST(168311178395648 AS DateTime), CAST(168311187818348 AS DateTime), CAST(168311187859748 AS DateTime), ......);

当找到十六进制数字正则表达式("(0x[\dA-F]+)")时,将以匹配为参数调用lambda。拿第一个&只有group,将其解析为base-16整数,然后将其转换回string。