Python - 读取txt文件中列出的.htm文件

时间:2014-10-16 07:05:34

标签: python

我在下面用来阅读一些.htm文件。

from bs4 import BeautifulSoup
import os

BASEDIR = "C:\\designers"
aa = os.listdir(BASEDIR)

text_file = open(os.path.join(BASEDIR, 'all htm.txt'), "w")

for b in aa:
    if b.endswith('.htm'):
        c = os.path.join(BASEDIR, b)
        text_file.write(c)
        text_file.write('\n')


text_file.close()

list_open = open(os.path.join(BASEDIR, 'all htm.txt'))
read_list = list_open.read()
line_in_list = read_list.split('\n')

for i, ef in enumerate(line_in_list):
    page = open(ef)
    soup = BeautifulSoup(page.read())
    print i
    print soup

然而它只读取第一个文件,然后给出错误:

IOError: [Errno 22] invalid mode ('r') or filename: ''

出了什么问题?

感谢。


'kev'指出了问题:txt文件中有不需要的行。

有很多方法可以删除txt中的空行。

除此之外,最后一部分可以改为:

for i, ef in enumerate(line_in_list):
    if '.htm' in ef:         # or 'len(ef) > 1' etc...
    page = open(ef)
    soup = BeautifulSoup(page.read())
    print i
    print soup

2 个答案:

答案 0 :(得分:1)

因为当你创建'all htm.txt'(不管它是否是最后一行)时,你在每一行的末尾写\n,你的文件末尾会出现一个空行。因此,当您在换行符上拆分时,在line_in_list末尾会出现一个空字符串。

相反,执行enumerate(line_in_list[:-1])将忽略最终(空)元素。

或者,您可以通过在迭代的每个循环周围放置try: except:块并在发生异常时优雅地处理/忽略异常来使代码更加健壮。这将保护您免受代码中的未来问题:

例如:

for i, ef in enumerate(line_in_list):
    try:
        page = open(ef)
        soup = BeautifulSoup(page.read())
        print i
        print soup
    except IoError:
        print 'ignoring file %s'%ef
    except Exception:
        print 'an unhandled exception occurred for file %s'%ef

答案 1 :(得分:1)

错误发生在代码的哪一行会很有趣。

请注意从文件b中读取的行aa。它们以换行符\n结束。因此,IF条件永远不会成立,并且您生成一个空文件all html.txt

尝试

x=b.strip()
    if(x.endswith(".htm")):
        ....

这将在b的开头和结尾剪切任何空格(如space,carriageReturn,tab,newLine)。