这是我的文件blah.log的一个示例
Y:\TH2020-0600_1P00392G01_02\1P00392G01_02.obc[30-SEP-20 10:42:47
@30-SEP-20 10:42:51
yhjubad7
q28ed7qai
aiuwdh8
"30-SEP-20 10:43:06
@30-SEP-20 10:43:39 nkdjaw adibw
akwudbnawikd
/30-SEP-20 10:43:52 @30-SEP-20 10:43:52 ahuwsd8
2dhaiubd 98wha98 "30-SEP-20 10:49:39
]30-SEP-20 11:29:03
Y:\TH2020-0600_1P00392G01_02\1P00392G01_02.obc[01-OCT-20 11:19:08 ]01-OCT-20 11:26:29
还有很多(像几千行),但我只是总结一下
我想删除以“@”开头、以“/”结尾的一段行(结尾部分是“?”或“!”)
这是我的密码
file = "cpcpk/1P00392G01_02.LOG"
newfile="cpcpk/New_1P00392G01_02.LOG"
new=open(newfile,'w')
with open(file) as input_data:
# loops through the whole file
for line in input_data:
# reset data
data=[]
if line.startswith('@'):
# Skips text before the beginning of the interesting block
for line in input_data:
if line.startswith('@'):
#write test log in a new file
data.append(line)
break
# Reads text until the end of the block:
for line in input_data:
if line.startswith('"'):
data.append(line)
new.writelines(data)
break
elif line.startswith('/'):
break
elif line.startswith('?'):
break
elif line.startswith('!'):
break
data.append(line)
new.close()
第一个问题
当我运行它时,它确实删除了它,但是我想删除的一些行也被删除了
第二个问题
如果我这样编码,第一行和最后几行也不会被写入
这是我想要的输出:
Y:\TH2020-0600_1P00392G01_02\1P00392G01_02.obc[30-SEP-20 10:42:47
@30-SEP-20 10:42:51
yhjubad7
q28ed7qai
aiuwdh8
"30-SEP-20 10:43:06 @30-SEP-20 10:43:52 ahuwsd8
2dhaiubd
98wha98
"30-SEP-20 10:49:39
]30-SEP-20 11:29:03
Y:\TH2020-0600_1P00392G01_02\1P00392G01_02.obc[01-OCT-20 11:19:08
我的意思是,如果行以@
开始,例如@30-SEP-20 10:42:51
,那么它将开始将行写入列表。然后,当for行循环时,循环到以"
开头的行,例如"30-SEP-20 10:43:06
,它将停止循环,然后将列表写入新文件,但如果它循环到以/
开头的行,例如/30-SEP-20 10:43:06
,它将停止循环并重置列表,然后重新开始。就像我写的那样。你可以看到我有3个循环。第二个和第三个循环是找到我想要的和我不想要的。然后,第一个循环是重复第二个和第三个循环
类似于下面的代码:
您可以使用regex指定一个模式来检测要删除的行:
Regex Demo
如果文件太大,您无法一次读取所有文件,您可以执行以下操作:
这是为行保存一个缓冲区,每次遇到
@
时,缓冲区都会刷新到文件中。另一方面,当遇到/
时,缓冲区被重置。可能需要一些边缘案例的工作,但这是给你一个想法在您的问题中,您说过要删除以“@”开头、以“/”结尾的行,但您的文件中没有这样的行?如果这是您想要做的,那么下面的代码应该可以工作,并将创建一个新文件,删除所有符合设置条件的行(即以“@”开头,以“/”结尾)
相关问题 更多 >
编程相关推荐