从文件中删除以特定字符串开头的行,其中包含引号

时间:2017-01-30 21:58:26

标签: python python-2.7

我需要在大约25,000行中删除大约四千行包含SEU / C0的行。     在以下行中找到SEU:

inpin "SEUC0/example_controller/U0/wrapper_wrappe/genx7.wrapper_controller/pid_reg<3>" A6 ,

我的测试文件的更大部分如下所示:

outpin "XDL_DUMMY_INT_R_X27Y147_TIEOFF_X29Y147" HARD1 ,
  inpin "SEUC0/example_controller/U0/wrapper_wrapper/genx7.wrapper_controller/controller_kcpsm3/pc_vector_carry<7>" A6 ,
  inpin "SEUC0/example_controller/U0/wrapper_wrapper/genx7.wrapper_controller/controller_kcpsm3/pc_vector_carry<7>" B6 ,
  inpin "SEUC0/example_controller/U0/wrapper_wrapper/genx7.wrapper_controller/controller_kcpsm3/pc_vector_carry<7>" C6 ,
  inpin "SEUC0/example_controller/U0/wrapper_wrapper/genx7.wrapper_controller/controller_kcpsm3/pc_vector_carry<7>" D6 ,
  pip CLBLM_R_X27Y147 CLBLM_IMUX13 -> CLBLM_L_B6 , 
  pip CLBLM_R_X27Y147 CLBLM_IMUX34 -> CLBLM_L_C6 , 
  pip CLBLM_R_X27Y147 CLBLM_IMUX42 -> CLBLM_L_D6 , 
  pip CLBLM_R_X27Y147 CLBLM_IMUX5 -> CLBLM_L_A6 , 
  pip INT_R_X27Y147 VCC_WIRE -> IMUX13 , 
  pip INT_R_X27Y147 VCC_WIRE -> IMUX34 , 
  pip INT_R_X27Y147 VCC_WIRE -> IMUX42 , 
  pip INT_R_X27Y147 VCC_WIRE -> IMUX5 ,

这是我尝试的解决方案:

f = open("test.xdl","r+")
d = f.readlines()
f.seek(0)
for i in d:
    if i != "SEU":  # want to remove the SEU string
        f.write(i)
f.truncate()
f.close()

如果我这样做:

for i in d:
    if i=='inpin "SEUC0/':
        f.write(i)
f.truncate()
f.close()

输出文件为空。

当我尝试

i!="inpin SEUC0/ 

它没有用,因为它是一个很长的字符串,如果我写的话

"inpin "SEUC0/""

Python出错。

无论如何我可以删除包含SEUC0的所有这些行吗?

1 个答案:

答案 0 :(得分:0)

看起来你的代码几乎可以工作,除了你引用字符串和进行比较的方式。怎么样?

f = open("test.xdl","r+")
d = f.readlines()
f.seek(0)
for i in d:
    if not i.strip().startswith('inpin "SEUC0/'):
        f.write(i)
f.truncate()
f.close()

请注意,这会在搜索字符串周围使用单引号,以便字符串可以包含双引号。它还使用.strip()删除前导空格,然后使用.startswith()检查该行是否以正确的子字符串开头。当您使用==!=时,它们会检查字符串是否完全相同。但您只想检查该行是否以特定字符串开头。