在一组文件上迭代一段代码



我写了一段代码,可以从名为195775.html的文件中提取表。我将输出保存在一个文本文件中。现在,我需要为同一目录中的所有20000个文件迭代此代码。此外,我还希望用它们各自的文件名来标记这些文件。即,每个文件都应该有一列(在表中),该列以文件名作为其值。此外,我希望输出文本文件按照输入文件命名(即名称应该匹配)。

这是我的代码:

import urllib2
import os
import time
import traceback
from bs4 import BeautifulSoup
outfile= open('C:/Users/Manvendra/Dropbox/Python/195775.txt','wb')
rfile  = open('C:/Users/Manvendra/Dropbox/PRI/Data/AP/195775.html')
rsoup  = BeautifulSoup(rfile)
nodes  = rsoup.find('div',{'class':'frmhdtitle'})
if nodes!= None: 
    #print "div present"
    x = nodes.findNext('table')
    if x!= None:
     #print "table present"
     y = x.find('tbody')
     if y!= None:
      #print "tbody present"
      z= y.findAll('tr')
      if z!= None:
       #print "tr present"
       for wx in z[1:]:
        num=    wx.find('td').get_text()                     
        print num
        name=   wx.find('td').findNext('td').get_text()
        print name      
        age =   wx.find('td').findNext('td').findNext('td').get_text()
        print age
        caste=  wx.find('td').findNext('td').findNext('td').findNext('td').get_text()
        print caste
        gender= wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
        print gender
        quali = wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
        print quali
        occu  = wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
        print occu
        #email  = wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
        #print email
        #ward  = wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
        #print ward
        resr  = wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
        print resr
        outfile.write(str(num) +"t" + str(name) +"t" + str(age) +"t" + str (caste) +"t" + str(quali) +"t" + str(occu) + "t" + str(resr) + str(infile) +"n") 
outfile.close()        

将代码放入一个单独的函数中,并为目录中的每个html文件调用它:

#!/usr/bin/env python2
import os
from glob import glob
dest_dir = 'C:/Users/Manvendra/Dropbox/Python'
for html_filename in glob('C:/Users/Manvendra/Dropbox/PRI/Data/AP/*.html'):
    basename = os.path.splitext(os.path.basename(html_filename))[0]
    with open(html_filename, 'rb') as html_file, 
         open(os.path.join(dest_dir, basename + '.txt'), 'wb') as csv_file:
        html2csv(html_file, csv_file)

其中html2csv()为:

import logging
from bs4 import BeautifulSoup
log = logging.getLogger(__name__)
def html2csv(html_file, csv_file):
    writerow = csv.writer(csv_file, dialect=csv.excel_tab).writerow
    div = BeautifulSoup(html_file).find('div', 'frmhdtitle')
    try:
        rows = div.find_next('table').tbody.find_all('tr')[1:]
    except AttributeError:
        log.warning("No info in %s file", html_file.name)
    else:
        for tr in rows:
            writerow([td.get_text().encode('utf-8')
                      for td in tr.find_all('td')[:8]] + [html_file.name])

注意:代码中的findNext('td')方法在不考虑元素边界的情况下搜索html文档,即,它可能会找到属于不同行甚至不同表的td,只要它在文档中更远。我重写了这个循环,假设您希望在每行中找到八个相邻的<td>元素。

这样做:

files = os.listdir(directoryPath)
for file in files:
    *your code*

请注意,如果要打开文件,则需要打开路径:directoryPath+"/"+file。关于您想要命名文件的所有标记和文件名,"file"现在是一个变量,它包含您正在处理的文件的名称,所以您可以随心所欲地使用它。

最新更新