在 .txt 文件中查找字符串并将其删除

finding string in .txt file and delete it

我将文件夹内容(.pdf、.doc 和 .xls 文件)写在一个小的 txt 文件中。每个文件名在 txt 文件中都有一个新行。工作正常。 现在我想删除所有带有 .pdf 文件的行。 我仍然使用以下代码删除错误条目(在本例中为 fail.png):

def clean():
    with open("files.txt", "r") as f:
        lines = f.readlines()
        with open("files.txt", "w") as f:
            for line in lines:
                if line.strip("\n") != "fail.png":
                    f.write(line)

clean_folderlog()

是否可以使用某种“通配符”(*.pdf) 来代替特定的文件名? 还是有其他完整的方法来解决这个问题?

非常感谢

有多个选项:

您可以检查该行是否包含字符串“.pdf”:

if not "pdf" in line.strip("\n")
    f.write(line)

您也可以使用 regular expression。这在您想要进行更复杂的模式匹配的其他情况下可能很有用。

import re

with open("testdata.txt", "w") as f:
    for line in lines:
        line = line.strip()
        if not re.match(".+\.pdf$",line):
            f.write(line)
  • .+ 匹配任何字符
  • \. 匹配文字点
  • pdf 匹配文字字符 'pdf'
  • $ 匹配行尾

整个代码如下所示:

def clean():
    with open("files.txt", "r") as f:
        lines = f.readlines()
    with open("files.txt", "w") as f:
        for line in lines:
            if not "pdf" in line.strip("\n"):
                f.write(line)

clean_folderlog()

此外,我修复了缩进,因为 write-open 不必缩进

你有很多选择:

  • 检查字符串是否以“.pdf”结尾

      if not line.endswith(".pdf"):
    
  • 使用re模块(最通用的模式匹配):

      import re
      ...
      if not re.match(r"\.pdf$", line):
    
  • 使用 fnmatch 模块进行 shell-style 模式匹配:

      from fnmatch import fnmatch
      ....
      if not fnmatch(line, "*.pdf"):
    

你可以很容易地替换你写文件夹内容和删除不需要的文件这两个功能,例如,这样的代码片段,写在下面:

import os

extensions = ['.pdf', 'PUT_YOUR_OTHER_EXTENSIONS']

with open('test.txt', 'w') as f:
    for file_name in os.listdir('PUT_YOUR_FOLDER_PATH'):
            if os.path.isfile(file_name) and not file_name.endswith(tuple(extensions)):
                f.write("%s\n" % file_name)

它会将您文件夹的所有文件名写入一个文件。您只需要放入不需要的列表扩展。享受吧!

注意: 这适用于os.listdir() 函数中提到的一个文件夹。要写入子文件夹中的所有文件,请使用递归遍历。