如何在不获取文件的情况下读取文件

时间:2016-11-15 15:54:05

标签: python dictionary

我需要用带数字的文本文件制作一个字典。密钥应该是数字,属性应该是文档中存在该数字的次数。

然而,如果不搞砸我的柜台,我似乎无法做到这一点。这就是我的尝试:

def number_frequency(filename):
    dic={}
    with open(filename, "r+") as f:
        for line in f:
            if line not in dic.keys():
                dic[line.rstrip('\n')]=int(1)
            elif line in dic.keys():
                dic[line.rstrip('\n')]+=1
    return dic

像这样的文件

1
2
3
4
5
5
5
5

打印出来:

{'1': 1, '5': 2, '4': 1, '2': 1, '3': 1}

我如何解决这个问题?

5 个答案:

答案 0 :(得分:0)

您可以先从内容中用空格\n替换" ",然后将内容转换为数字列表,然后使用collections.Counter()查找计数。以下是代码示例:

import StringIO
from collections import Counter

f = StringIO.StringIO("""
        1 2 3 4 5 6 \n
        7 8 9 1 4 5 \n
        1 7 4 7 9 3""")    # Here f is the file like object


# Your logic starts from here
num_list = f.read().replace('\n', ' ').split()
my_counter = Counter(num_list)
# content of `my_counter`:
{
'1': 3, 
'4': 3, 
'7': 3, 
'3': 2, 
'5': 2, 
'9': 2, 
'2': 1, 
'6': 1, 
'8': 1
}

答案 1 :(得分:0)

使用stripcollections.Counter

from collections import Counter
with open(filename) as f:
    c=Counter(map(str.strip, f.readlines())) #or rstrip.  map for conciseness

答案 2 :(得分:0)

您可以使用收集模块中的Counter,它就是这样做的。

如果您的数据是可靠的(没有奇怪的字符),使用int构造函数将为您删除\ n。

首先,您将这些行作为列表(如果文件大于您的内存,请不要这样做)。

然后使用map(或列表理解/生成器:[int(n) for n in num_list] (int(n) for n in num_list),然后将此列表传递给Counter

from collections import Counter

with open("number.txt") as f:
    num_list = f.readlines()

c = Counter(map(int, num_list))

print(c)

答案 3 :(得分:0)

不要离原始代码太远,我提供此。

from collections import defaultdict

def number_frequency(filename):
    dic = defaultdict(int)
    with open(filename, 'r') as f:
        for line in f:
            line=line.rstrip()
            dic[line]+=1
    return dic

print ( number_frequency('temp.txt') )
    这些年来,
  • defaultdict 将为您节省很多痛苦和精力。
  • 最好避免' r +'除非你真的需要它。 (它允许在同一个文件上进行读写。)
  • 只是习惯从文本文件中删除行尾字符。

答案 4 :(得分:-1)

def number_frequency(filename):
    dic={}
    with open(filename, "r+") as f:
        for line in f:
            if "\n" in line:
                line=line[:-1]
            if line not in dic.keys():
                dic[line]=int(1)
            elif line in dic.keys():
                dic[line]+=1
    return dic