我有一个程序可以计算特定文本文件中的字母,(在我的例子中," Words.txt")。但是,当我尝试更改代码以接受用户输入而不是查找特定文件时,我得到以下内容: - ' STR'对象没有属性' readlines'
我确信这是我正在做的事情,但我不明白为什么。我的代码如下:
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 :(得分: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
...
答案 1 :(得分:0)
尝试:
fname = raw_input("Enter file name: ")
fname = open(fname, 'r')
另外两条建议:
1)处理文件时使用with
语句(https://docs.python.org/2/tutorial/inputoutput.html)
2)无需在file_list中存储所有行,只需遍历文件对象
filename = raw_input("Enter file name: ")
with open(filename, 'r') as fil:
for line in fil:
...
答案 2 :(得分:0)
问题是readlines()
只能在文件输入上调用。用户输入(字符串)的等效值为splitlines()
。
答案 3 :(得分:0)
假设您希望用户提供文件名(如我提供更多详细信息时提供的其他答案中所述),您只需执行以下操作:
fname=raw_input("Enter file name")
file_list = open(fname).readlines()
如果您希望用户输入数据,您可以这样做
file_list = sys.stdin.readlines()
另请注意,处理文件的首选方法是使用“with”
with open("x.txt") as f:
for line in f:
#process each line
这会在你完成时处理关闭文件,并且还允许你将f视为迭代器(这样你就可以根据需要读取每一行而不是一次读取所有行)
最后,如果您确实想要从stdin或文件中读取,至少在Unix-y操作系统下,可以使用上面的sys.stdin.readlines位,如果要从文件中读取,请执行{{1 }}