我正在编写一个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循环中,否则会显示每个文件的计数。但不幸的是,由于某些原因它不起作用。我还需要设置一个字典或者包含我想要计算的所有单词的东西,但我不知道该怎么做。任何帮助将不胜感激。
答案 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
包含所有单词(包括标点符号)。您可以删除标点符号并分别使用String和Collections模块计算单词。
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