我有一个看起来像的文本文件:
CREATE TABLE address(
location_pk integer NULL,
City varchar(50) NULL,
Address1 varchar(50) NULL,
Address2 varchar(50) NULL,
CREATE TABLE name(
idinteger NULL,
City varchar(50) NULL,
RootDCTKey integer NULL,
Class varchar(50) NULL,
CREATE TABLE location(
location_pk integer NULL,
City varchar(50) NULL,
Rootkey integer NULL,
我需要添加");"并删除逗号','在每个表结束之后,它看起来像:
CREATE TABLE address(
location_pk integer NULL,
City varchar(50) NULL,
Address1 varchar(50) NULL,
Address2 varchar(50) NULL );
CREATE TABLE name(
idinteger NULL,
City varchar(50) NULL,
RootDCTKey integer NULL,
Class varchar(50) NULL );
CREATE TABLE location(
location_pk integer NULL,
City varchar(50) NULL,
Rootkey integer NULL );
我的方法是将文件的更正版本写入另一个文件
opFile1 = open('txtfile.txt','rb').readlines()
finalfile = open('finaltxtfile.txt','wb')
for i,line in enumerate(opFile1):
if not line.startswith('CREATE TABLE'):
finalfile.write(line)
else:
#overwrite the last written line with the corrected line
finalfile.write(opFile1[i-2].rstrip(',')+' );')
#write the original 'CREATE TABLE' line
finalfile.write(line)
此方法只是在CREATE TABLE行之前添加了更正的行,并且不删除原始的错误行。请帮助你的想法。谢谢:))
答案 0 :(得分:2)
希望这会有所帮助。对于每一行,在枚举索引的帮助下,检查下一行到下一行是否以CREATE
开头(我已将其设为CREATE,您可以根据需要修改字符串)。如果是,请执行替换line.replace(',',');')
并写入该行。我们还需要替换最后一行;这在if or i+1==len(opFile1)
中作为条件添加。 i+2<len(opFile1)
就在那里,以防止索引越界。
opFile1 = open('txtfile.txt','r').readlines()
finalfile = open('finaltxtfile.txt','w')
for i,line in enumerate(opFile1):
if i+2<len(opFile1) and opFile1[i+2].startswith('CREATE') or i+1==len(opFile1):
finalfile.write(line.replace(',',');'))
else:
finalfile.write(line)
finalfile.close()
顺便说一句,您使用二进制模式rb
,wb
来编写不必要的字符串,我已将其更改为普通模式r
和w
。
答案 1 :(得分:1)
如果文件不是很大,我就不会费心处理每一行。我只是将整个文件读入变量,在最后一个逗号上执行查找/替换,然后将变量写入新文件(或原始文件)。
答案 2 :(得分:1)
您可以使用re
来完成工作:
finalfile.write(re.sub(b'NULL,(\s*\n*)(CREATE|\Z)', rb'NULL);\1\2', opFile1))