1

我有大约 50 000 个 HTML 文件的文件夹。我正在尝试编写打开文件的脚本,如果标题包含某个字符串,则应该删除文件。

这是我迄今为止的尝试:

import aiofiles
import glob
from natsort import natsorted
import asyncio
from bs4 import BeautifulSoup
import os

    async def main():
        i=0
        htmls = glob.glob("CarsPages" + "//*.html")
        for html in natsorted(htmls):
            async with aiofiles.open(html, mode='r', encoding='UTF-8',  errors='strict', buffering=1) as f:
                contents = await f.read()
                soup = BeautifulSoup(contents, features="lxml")
                if "Best portal" in soup.title.get_text():
                    i+=1
                    os.close(html) 
                    os.remove(html)
                    print("removing: ", html)
        print("Removed: ", i, " pages")
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

但我得到:

os.close(html) TypeError: an integer is required (got type str)

不知道使用 aiofiles 打开后要使用哪些函数来关闭和删除?

编辑 - 基于@joao 答案的工作代码

import aiofiles
import glob
from natsort import natsorted
import asyncio
from bs4 import BeautifulSoup
import os

async def main():
    i=0
    htmls = glob.glob("CarsPages" + "//*.html")
    for html in natsorted(htmls):
        async with aiofiles.open(html, mode='r', encoding='UTF-8',  errors='strict', buffering=1) as f:
            contents = await f.read()
            soup = BeautifulSoup(contents, features="lxml")
        if "Best portal" in soup.title.get_text():
            i+=1
            os.remove(html)
            print("removed: ", html)
    print("Removed: ", i, " pages")

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
4

1 回答 1

1

我假设您使用的是 python >= 3.5,您使用aiofiles.open的是上下文管理器,因此您不必担心自己关闭文件。您需要做的只是退出上下文管理器块,当您的条件确定应该删除文件时,然后在上下文管理器块之后删除文件(是的,os.remove是适合该工作的功能,只需确保您不需要绝对路径)。

不幸的是,您不能使用break上下文管理器,但这个问题显示了实现相同结果的各种方法。

于 2021-04-05T15:53:30.827 回答