删除 txt 文件中包含字符串的行 python
Delete line that contains a string in a txt file 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
中。
您的代码正在尝试进行(不)相等比较 - 而您应该检查子字符串(即 email
是否出现在 line
中)。
一个合适的条件是:
if email not in line:
有许多注意事项需要解决:
- 如果您的文件很大,将其全部加载到内存中并不是一个好主意。
- 如果在处理过程中出现异常(甚至可能是
KeyboardInterrruptException
),通常最好不要修改原始文件(因此,我们会尽量使您的操作 ACID)。
- 如果多个并发进程试图修改您的文件,您需要一些保证,至少您的文件是安全的(也是 ACID)。
- 您可能(也可能不)想要备份您的文件。
有很多可能性(参见 this SO question). In my experience however, I got mixed results with fileinput
:它可以很容易地修改一个或多个文件,可以选择为每个文件创建一个备份,但不幸的是它急切地写入每个文件(可能遇到异常就不完整了。我在最后放了个例子供大家参考。
我发现最简单和最安全的方法是使用一个临时文件(与您正在处理的文件位于同一目录中,并以唯一但可识别的方式命名),从 src
to tmp
, then mv tmp src
其中,至少出于实用目的,is atomic on most POSIX filesystems.
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\.com\b', 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)
这将在第一个匹配行上引发 ZeroDivisionError
。但是请注意在这种情况下您的文件根本没有被修改(并且没有进行备份)。作为副作用,临时文件仍然存在(这与其他实用程序一致,例如 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
我正在尝试删除包含变量(电子邮件)的 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
中。
您的代码正在尝试进行(不)相等比较 - 而您应该检查子字符串(即 email
是否出现在 line
中)。
一个合适的条件是:
if email not in line:
有许多注意事项需要解决:
- 如果您的文件很大,将其全部加载到内存中并不是一个好主意。
- 如果在处理过程中出现异常(甚至可能是
KeyboardInterrruptException
),通常最好不要修改原始文件(因此,我们会尽量使您的操作 ACID)。 - 如果多个并发进程试图修改您的文件,您需要一些保证,至少您的文件是安全的(也是 ACID)。
- 您可能(也可能不)想要备份您的文件。
有很多可能性(参见 this SO question). In my experience however, I got mixed results with fileinput
:它可以很容易地修改一个或多个文件,可以选择为每个文件创建一个备份,但不幸的是它急切地写入每个文件(可能遇到异常就不完整了。我在最后放了个例子供大家参考。
我发现最简单和最安全的方法是使用一个临时文件(与您正在处理的文件位于同一目录中,并以唯一但可识别的方式命名),从 src
to tmp
, then mv tmp src
其中,至少出于实用目的,is atomic on most POSIX filesystems.
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\.com\b', 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)
这将在第一个匹配行上引发 ZeroDivisionError
。但是请注意在这种情况下您的文件根本没有被修改(并且没有进行备份)。作为副作用,临时文件仍然存在(这与其他实用程序一致,例如 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