删除txt文件python中包含字符串的行



我正试图删除一个包含变量(电子邮件(的txt文件中的一行。

我想删除包含电子邮件的整行,例如。mano@gmail.com不仅仅是变量这就是我到目前为止所想到的,但似乎并不奏效。

with open("wappoint.txt.txt", "r") as w:
lines = w.readlines()
with open("wappoint.txt.txt", "w") as w:
for line in lines:
if email.strip("n") != email:
w.write(line)

txt文件的内容是

vasv@gmail.com, 1
mano@gmail.com, 3

你在找这个吗?:

with open("wappoint.txt", "r") as w:
lines = w.readlines()
with open("wappoint.txt", "w") as w:
for line in lines:
if email not in line:
w.write(line)

如果该行包含电子邮件,则删除该行。

您似乎只是想检查email是否出现在line中。

您的代码试图进行(in(相等性比较,而您应该检查子字符串(即email是否出现在line中(。

一个合适的条件是:

if email not in line:

有许多注意事项需要解决:

  1. 如果您的文件很大,那么将其全部加载到内存中不是一个好主意
  2. 如果在处理过程中发生某些异常(甚至可能是KeyboardInterrruptException(,通常需要保持原始文件不变(因此,我们将尝试使您的操作为ACID(
  3. 如果多个并发进程试图修改您的文件,您希望得到一些保证,至少您的文件是安全的(也是ACID(
  4. 您可能想要(也可能不想要(文件的备份

有很多可能性(例如,请参见本SO问题(。然而,根据我的经验,fileinput的结果喜忧参半:它可以很容易地修改一个或多个文件,也可以为每个文件创建备份,但不幸的是,它在每个文件中都热切地写入(遇到异常时可能会使其不完整(。最后我举了一个例子作为参考。

我发现最简单、最安全的方法是使用一个临时文件(与您正在处理的文件位于同一目录中,并以可识别的方式唯一命名(,从srctmp然后mv tmp src执行操作,至少出于实际目的,这在大多数POSIX文件系统上是原子操作。

def acceptall(line):
return True
def filefilter(filename, filterfunc=acceptall, backup=None):
if backup:
backup = f'{filename}{backup}'  # leave None if no backup wanted
tmpname = tempfile.mktemp(prefix=f'.{filename}-', dir=os.path.dirname(filename))
with open(tmpname, 'w') as tmp, open(filename, 'r') as src:
for line in src:
if filterfunc(line):
tmp.write(line)
if backup:
os.rename(filename, backup)
os.rename(tmpname, filename)

案例示例:

filefilter('wappoint.txt.txt', lambda line: email not in line)

使用正则表达式排除多个电子邮件地址(不区分大小写且仅完全匹配(,并生成.bak备份文件:

matcher = re.compile(r'.*b(bob|fred|jeff)@foo.comb', re.IGNORECASE)
filefilter(filename, lambda line: not matcher.match(line), backup='.bak')

我们还可以模拟如果在中间(例如,在第一条匹配线上(引发异常会发生什么:

def flaky(line):
if email in line:
1 / 0
return True
filefilter(filename, flaky)

这将在第一匹配线上升高CCD_ 11。但请注意,在这种情况下,您的文件根本不会被修改(也不会进行备份(。副作用是,临时文件保留(这与其他utils一致,例如rsync,当中断时,会在目标位置留下.filename-<random>不完整的临时文件(。


正如承诺的那样,这里还有一个使用fileinput的示例,但有前面解释的注意事项:

with fileinput.input(filename, inplace=True, backup='.bak') as f:
for line in f:
if email not in line:
print(line, end='')  # this prints back to filename

相关内容

最新更新