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

时间:2014-10-19 15:40:27

标签: python file for-loop beautifulsoup

我编写了一段代码,可以从名为195775.html的文件中提取表格。我将输出保存在文本文件中。现在我需要为同一目录中的所有20,000个文件迭代此代码。此外,我还希望使用各自的文件名标记文件。即每个文件应该有一个列(在表中),它以 filename 为其值。另外,我希望根据输入文件命名输出文本文件(即名称应该匹配)。

这是我的代码:

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()        

2 个答案:

答案 0 :(得分:0)

做这样的事情:

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

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

答案 1 :(得分:0)

将您的代码放入一个单独的函数中,并为目录中的每个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>元素。