如何在python中读取excel数据并优化代码

时间:2017-02-17 16:21:17

标签: python python-2.7 excel-2010

我的代码是计算代币。 它从文本文件中获取输入。我想从excel获取输入但是如何? 另一个问题是代码不适用于相对较大的数据。我该如何优化它?

# start
import codecs
from collections import Counter
def count_char(Input):

#Input file
fi= codecs.open('G:\python-proj/text.txt' , 'r',encoding='utf-8')
Input= fi.read()

#count words
spli=Input.split()
freq = Counter(spli)
sum=len(list(freq.elements()))
print('Total Tokenes:\n ')       
print(sum)
print('\n')
count_char(Input)

2 个答案:

答案 0 :(得分:1)

1)您可以将excel文件保存为.csv和Python的内置CSV阅读器来解析它。

2)大型数据集速度慢,因为您使用fi.read()一次性将整个文件读入内存。你可以计算每一行的代币:

for line in fi.read(): do something with (line.split())

答案 1 :(得分:1)

Input= fi.read()将整个文件读入内存。这就是大文件绊倒你的原因。解决方案是逐行阅读。

由于您要将单词保存在Counter对象中,因此大文件仍然会让您失望。如果重复很少,那么该对象将变得非常大。如果重复是常见的内存将不是一个问题。

list(someCounter.elements())有大量计数时,无论你做什么都不打电话someCounter。它将返回一个非常大的列表。 (如果someCounter = Counter({'redrum': 100000}),则list(someCounter.elements())将为您提供包含100000个元素的列表!)

char_count = 0
word_counter = Counter()
with codecs.open('G:\python-proj/text.txt' , 'r',encoding='utf-8') as f:
    for line in f:
        char_count += len(line)
        word_counter.update(line.split())
unique_word_count = len(word_counter)
total_word_count = sum(word_counter.itervalues())

请注意,使用line.split()可能会导致某些字词被视为唯一,您不会认为这些字词是唯一的。考虑:

>>> line = 'Red cars raced red cars.\n'
>>> Counter(line.split())
Counter({'cars': 1, 'cars.': 1, 'raced': 1, 'red': 1, 'Red': 1})

如果我们希望将'red''Red'计算在一起而不管大小写,我们可以这样做:

>>> line = 'Red cars raced red cars.\n'
>>> Counter(s.lower().split()) # everything is made lowercase before counting
Counter({'red': 2, 'cars': 1, 'cars.': 1, 'raced': 1})

如果我们希望将'cars''cars.'统计在一起而不管标点符号,我们就像这样删除标点符号:

>>> import string
>>> punct = string.punctuation
>>> line = 'Red cars raced red cars.\n'
>>> Counter(word.strip(punct) for word in line.lower().split())
Counter({'cars': 2, 'red': 2, 'raced': 1})

关于阅读Excel文件,您的问题需要更具针对性。从python-excel.org开始,选择看起来最合适的库,尝试编写一些代码,搜索StackOverflow以获取答案,然后将您遇到的任何问题作为问题发布,并将代码显示为您尝试的内容。