在python中编辑文本文件

时间:2017-08-29 10:33:55

标签: python

我有一个看起来像的文本文件:

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行之前添加了更正的行,并且不删除原始的错误行。请帮助你的想法。谢谢:))

3 个答案:

答案 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()

顺便说一句,您使用二进制模式rbwb来编写不必要的字符串,我已将其更改为普通模式rw

答案 1 :(得分:1)

如果文件不是很大,我就不会费心处理每一行。我只是将整个文件读入变量,在最后一个逗号上执行查找/替换,然后将变量写入新文件(或原始文件)。

答案 2 :(得分:1)

您可以使用re来完成工作:

finalfile.write(re.sub(b'NULL,(\s*\n*)(CREATE|\Z)', rb'NULL);\1\2', opFile1))