2017-02-17 16 views
0

Мой код предназначен для подсчета маркеров. Он принимает входные данные из текстовых файлов. Я хочу принять участие от Excel, но как? Другая проблема заключается в том, что код не работает для относительно больших данных. Как его оптимизировать?как читать данные excel и оптимизировать код в python

# 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) 
+0

Что касается чтения файлов Excel, ваш вопрос должен быть более целенаправленным. Начните с python-excel.org, выберите библиотеку, которая кажется наиболее подходящей, попробуйте написать какой-то код, найдите StackOverflow для ответов, а затем опубликуйте любую проблему, с которой вы сталкиваетесь в качестве вопроса, вместе с кодом, показывающим, что вы пробовали. См. [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) в Справочном центре. Я ответил на другую часть вашего вопроса ниже. –

ответ

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, n должно быть более целенаправленным. Начните с python-excel.org, выберите библиотеку, которая кажется наиболее подходящей, попробуйте написать какой-то код, найдите StackOverflow для ответов, а затем опубликуйте любую проблему, с которой вы сталкиваетесь в качестве вопроса, вместе с кодом, показывающим, что вы пробовали.

+0

спасибо – kossaaar

+0

Я использую счетчик, потому что я не хотел подсчитывать повторяющиеся токены. Я большой человек на питоне. – kossaaar

+0

ohhhh вы правы. Я понимаю, что ты имеешь в виду. – kossaaar

1

1) Вы можете сохранить файл первенствовать как .csv и Python встроенный считыватель CSV, чтобы разобрать его.

2) Это медленное на больших наборах данных, потому что вы читаете весь файл в памяти сразу с fi.read(). Вы можете рассчитывать маркеры на каждой строке:

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

+0

Большое спасибо – kossaaar