从以()开头、以()结尾的文件中删除一段行

2024-09-28 22:11:39 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的文件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个循环。第二个和第三个循环是找到我想要的和我不想要的。然后,第一个循环是重复第二个和第三个循环


Tags: theinnewforinputdataifline
3条回答

类似于下面的代码:

with open('blah.log') as f:
  lines = [l.strip() for l in f.readlines()]
  with open('blah1.log','w') as f1:
    for line in lines:
      if len(line) > 0 and line[0] == '@' and line[-1] == '/':
        continue
      else:
        f1.write(line + '\n')

您可以使用regex指定一个模式来检测要删除的行:

import re

with open(file) as input_file, open(newfile, 'w') as new:
    new.write(re.sub(r"@[^@]+/.*\n", "", input_file.read())

Regex Demo


如果文件太大,您无法一次读取所有文件,您可以执行以下操作:

buff = []
with open(file) as input_file, open(newfile, 'w') as new:
    for line in input_file:
        if line.startsiwth('@'):
            new.writelines(buff)
            buff = []
        if line.startswith('/'):
            buff = []
            continue
        buff.append(line)

这是为行保存一个缓冲区,每次遇到@时,缓冲区都会刷新到文件中。另一方面,当遇到/时,缓冲区被重置。可能需要一些边缘案例的工作,但这是给你一个想法

在您的问题中,您说过要删除以“@”开头、以“/”结尾的行,但您的文件中没有这样的行?如果这是您想要做的,那么下面的代码应该可以工作,并将创建一个新文件,删除所有符合设置条件的行(即以“@”开头,以“/”结尾)

file = 'thefile.txt'
newfile = 'thenewfile.txt'
data = []

with open(file, 'r') as rf, open(newfile, 'w') as wf:
    for line in rf:
        line = line.rstrip()
        if not line.startswith('@') and not line.endswith('/'):
            data.append(line)
    for line in data:
        wf.write(line + '\n')

相关问题 更多 >