Python - 从文件中获取数字列表并以dict表示形式返回

时间:2016-11-07 02:52:06

标签: list file python-3.x dictionary numbers

我无法从文件中读取并将内容作为字典返回。每个文件包含以\ 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可以包含不同的信息,功能需要考虑到这一点。感谢任何帮助的人

2 个答案:

答案 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!