使用python&amp ;;计算Excel工作表中特定单词的出现次数。 xlrd

时间:2015-04-20 08:16:03

标签: python xlrd

我正在编写一个python脚本,找到与脚本位于同一目录中的excel表(我大约有10个)并计算这些文件中特定单词的出现次数(如cloud,vmware,python等)然后将每个单词的总数写入文本文件。我正在使用python和xlrd来做到这一点。每个excel文件都有一个名为details的表单,这是信息所在的位置。每个文件有2列,大约26行。

for filename in os.listdir(path):


if filename.find('xls') != -1:
    print filename        
    workbook=xlrd.open_workbook(filename)
    sheet=workbook.sheet_by_name("Details")
    values = []
    for row in range(sheet.nrows):
        for col in range(sheet.ncols):
            values.append(unicode(sheet.cell(row,col).value))

            print values.count("cloud")

我使用for循环遍历每个文件的列和所有行,然后将所有值添加到列表中。然后我使用名为values的列表进行计数。我需要某种计数来计算每个单词的计数,因为所有内容都发生在for循环中,否则会显示每个文件的计数。但不幸的是,由于某些原因它不起作用。我还需要设置一个字典或者包含我想要计算的所有单词的东西,但我不知道该怎么做。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

对于您提出的新问题,如果您提供输入数据的示例,则可能会有所帮助。和预期的产出

我认为你应该改变

values.append(unicode(sheet.cell(row,col).value))

if " " in sheet.cell(row,col):
    values.append(str(sheet.cell(row,col).value.split(" ")))
else:
    values.append(str(sheet.cell(row,col)))

在这种情况下,您values包含所有单词(包括标点符号)。您可以删除标点符号并分别使用StringCollections模块计算单词。

from collections import Counter
import string
words = Counter(word.lower().strip(string.punctuation) for word in values)

print words应该在excel文件中打印所有单词,并在其前面放置一个计数器。

答案 1 :(得分:0)

单元格可能包含也可能不包含多个单词,因此在替换标点符号后必须split。在这里,它完成了翻译地图:

import xlrd
import os
from string import punctuation, translate
from collections import Counter

def count_words_trans():
    filename = u'test.xls'
    sheet_no = 1  # sheet is selected by index here
    path = '.'
    punctuation_map = dict((ord(c), u' ') for c in punctuation)

    for filename in os.listdir(path):
       if filename.endswith('.xls'):
          print filename
          workbook = xlrd.open_workbook(filename)
          sheet = workbook.sheet_by_index(sheet_no)
          values = []
          for row in range(sheet.nrows):
              for col in range(sheet.ncols):
                  c = sheet.cell(row, col)
                  if c.ctype == xlrd.XL_CELL_TEXT:
                     cv = unicode(c.value)
                     wordlist = cv.translate(punctuation_map).split()
                     values.extend(wordlist)

          cnt = Counter(values)
          print sum(cnt.values()),' words counted,',len(cnt),' unique'

像'action:run'这样的文本被正确地分成2个单词(不同于删除标点符号)。翻译方法是unicode-safe。为了提高效率,只读取包含文本的单元格(没有空格,没有日期,没有数字) 您可以通过以下方式获得单词频率列表:

for w in cnt.most_common():
    print '%s %s' % w