2015-04-09 3 views
0

У меня есть программа, которая будет считать буквы в определенном текстовом файле (в моем примере, «Words.txt»). Однако, когда я пытаюсь изменить код, чтобы принимать ввод пользователя вместо поиска определенного файла, я получаю следующее: - Объект 'str' не имеет атрибута 'readlines'Пытается подсчитать частоту письма в текстовом файле в Python

Я уверен, что это что-то действительно похожее на порог что я делаю, но я не понимаю, почему. Мой код ниже:

import string 
#fname=raw_input("Enter file name: ") 
fname=open('words.txt', 'r') 

#if len(fname) < 1 : fname = "words.txt" 
file_list = fname.readlines() 

freqs = dict() 
for line in file_list: 
line = filter(lambda x: x in string.letters, line.lower()) 
for char in line: 
    if char in freqs: 
     freqs[char] += 1 
    else: 
     freqs[char] = 1 
lst = list() 
for key, val in freqs.items(): 
    lst.append((val, key)) 

lst.sort(reverse=True) 

for key, val in lst[:] : 
    print key, val 
+0

Вы хотите вызвать readlines() для пользователя inout –

+0

'fname' не является хорошим именем для файлового объекта. Не путайте файлы с именами файлов. – Kevin

ответ

0

Try:

fname = raw_input("Enter file name: ") 
fname = open(fname, 'r') 

Два дополнительных советов:

1) Используйте with заявление при работе с файлами (https://docs.python.org/2/tutorial/inputoutput.html)

2) Нет необходимо сохранить все строки в файле_list, просто перебрать файлный объект

filename = raw_input("Enter file name: ") 
with open(filename, 'r') as fil: 
    for line in fil: 
     ... 
1

Что вы получаете от raw_input является просто строкой, содержащей имя файла. У вас все еще есть open, чтобы получить фактический дескриптор файла.

filename = raw_input("Enter file name: ") 
fname = open(filename, 'r') 

Кроме того, вы можете использовать with так, чтобы файл автоматически закрывается в конце выполнения. И вместо того, чтобы читать все строки в списке, вы можете просто перебрать файл напрямую.

filename = raw_input("Enter file name: ") 
with open(filename, 'r') as fname: 
    freqs = dict() 
    for line in fname: 
     ... 

Наконец, вы можете взглянуть на collections.Counter ...

0

Проблема заключается в том, что readlines() может быть вызвана только на входе файла. Эквивалент этого на входе пользователя (который является строкой) будет splitlines().

0

Предполагая, что вы хотите, чтобы пользователь, чтобы обеспечить имя файла (как указано в других ответах, которые пришли в то время как я был обеспечить более подробную информацию), вам просто нужно сделать:

fname=raw_input("Enter file name") 
file_list = open(fname).readlines() 

Если вы хотите, чтобы пользователь ввел данные, вы можете сделать file_list = sys.stdin.readlines()

Также обратите внимание, что предпочтительный способ обработки файлов является с «с»

with open("x.txt") as f: 
    for line in f: 
     #process each line 

Эта ручка s закрывает файл, когда вы закончите, а также позволяет обрабатывать f как итератор (чтобы вы могли читать каждую строку по мере необходимости и сразу читать все)

Наконец, если вы действительно хотите прочитать stdin или из файлов, по крайней мере, в Unix-y Operating Systems, вы можете использовать бит sys.stdin.readlines выше, и если вы хотите прочитать из файла, то python myprogram.py < filename

Смежные вопросы