我无法从文件中读取并将内容作为字典返回。每个文件包含以\ n分隔的数字,目标是计算将每个数字作为键返回的数字,并且键的值是它在文件中的次数。
示例:filea.txt
包含时
"1\n1\n1\n2\n3\n3\n3\n3\n5\n"
函数应该返回
{1:3,2:1,3:4,5:1}
当filea.txt
包含"100\n100\n3\n100\n9\n9\n"
时,该函数应返回{100:3, 3:1, 9:2}
当fileb.txt
包含"13\n13\n13\n13\n13\n13\n13\n13\n"
时,该函数应返回{13:8}
这是我目前的尝试:
def file_counts(filename):
a = open('filea.txt')
b = open('fileb.txt')
info = a.read()
info2 = b.read()
a.close()
b.close()
if info == True:
return (dict(collections.Counter(info)))
elif info2 == True:
return (dict(collections.Counter(info2)))
else:
return None
目前这给了我错误没有这样的文件或目录,我相信它是因为文件的内容在不同的测试用例中发生了变化。因此filea可以包含不同的信息,功能需要考虑到这一点。感谢任何帮助的人
答案 0 :(得分:1)
这样的事情应该足够了。请记住,尚未进行任何验证。例如,空白行,非数字字符。在您的问题中似乎应该将数字转换为整数,但您的代码不是,所以无论如何我都包含它。
from collections import Counter
def file_counts(filename):
# Open file for reading
with open(filename, 'r') as file:
data = []
# Go through each line of the file
for line in file:
value = int(line)
data.append(value)
return dict(Counter(data))
if __name__ == '__main__':
filename = 'testfile.txt'
print(file_counts(filename))
你遇到的问题。
def file_counts(filename):
a = open('filea.txt')
b = open('fileb.txt')
您正在读取两个文件并忽略作为参数提供的文件名。
info = a.read()
这将读取整个文件,通常不是最好的大文件。
if info == True:
info
永远不会是True
,因为它是一个字符串。
return (dict(collections.Counter(info)))
这通常很好,但是你没有格式化信息,因为它仍然是一个字符串,所以你的字典包含\n
个字符,它不适用于超过1个字符的数字个性。
您很可能会遇到IOError。如果您只想使用文件名,则需要与python文件位于同一目录中的文本文件,否则必须提供文件路径
答案 1 :(得分:0)
从您的陈述中,我假设您收到了IOError
,例如:
IOError: [Errno 2] No such file or directory: 'filea.txt'
如果收到此错误,那是因为open
无法在当前工作目录中找到与您要求提取的文件名匹配的文件。您需要将路径添加到文件名的开头,例如/home/username/project/filea.txt
,以确保python正在正确的目录中搜索。
一旦您能够打开文件并超过IOError,您的代码就会出现一些问题。
首先,让我们看一下dict(collections.Counter(info))
>>> info = "100\n100\n3\n100\n9\n9\n"
>>> dict(collections.Counter(info))
{'1': 3, '0': 6, '3': 1, '\n': 6, '9': 2}
正如我们所看到的,collections.Counter()
正在解析字符串中的每个字符并计算每个字符的出现次数。因此' 1',' 0'和' 3'每次计数三次而不是三次计数100次。相反,您可以按以下方式列出值:
>>> info = info.strip() # removes the last \n on the right
>>> nums = info.split('\n') # breaks up the string into a list of elements
>>> print(nums)
['100', '100', '3', '100', '9', '9']
>>> print(dict(collections.Counter(nums)))
{'9': 2, '100': 3, '3': 1}
你的输入和最后的if语句仍然有一些错误,但我会先让你捅一下。 GL!