我在下面用来阅读一些.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
答案 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)。