Python:在文件的行中计算一组特定的字符

时间:2015-08-29 00:41:15

标签: python string python-3.x

我正在努力使用Python中的一个小程序,它旨在计算文本文件行中特定字符集的出现次数。

例如,如果我想算数字!和' @'从以下几行

hi!
hello@gmail.com
collection!

我期待以下输出:

!;2
@;1

到目前为止,我得到了一个功能代码,但它效率低下,并没有使用Python库的潜力。 我尝试过使用collections.counter,但收效甚微。我找到的效率阻止器是我无法在counter.update()上选择特定的字符集,所有其余的字符也被计算在内。然后我必须过滤我不感兴趣的字符,这会增加另一个循环...... 我也考虑过正则表达式,但在这种情况下我无法看到优势。

这是我现在拥有的功能代码(我能想象的最简单的想法),它在文件的行中查找特殊字符。我想知道是否有人能想出一个更符合Python特色的想法:

 def count_special_chars(filename):
      special_chars = list('!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ ')
      dict_count = dict(zip(special_chars, [0] * len(special_chars)))

      with open(filename) as f:
          for passw in f:
              for c in passw:
                  if c in special_chars:
                      dict_count[c] += 1
      return dict_count

感谢您检查

4 个答案:

答案 0 :(得分:3)

为什么不统计整个文件?您应该避免为文件的每一行循环遍历字符串。请改用string.count。

from pprint import pprint

# Better coding style: put constant out of the function
SPECIAL_CHARS = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ '

def count_special_chars(filename):
    with open(filename) as f:
        content = f.read()
        return dict([(i, content.count(i)) for i in SPECIAL_CHARS])

pprint(count_special_chars('example.txt'))

示例输出:

{' ': 0,
 '!': 2,
 '.': 1,
 '@': 1,
 '[': 0,
 '~': 0
 # the remaining keys with a value of zero are ignored
  ...}

答案 1 :(得分:1)

collections.Counter中消除额外的计数可能不是很重要,但是如果它困扰你,那么在初始迭代期间这样做:

from collections import Counter
special_chars = '''!"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ '''
found_chars = [c for c in open(yourfile).read() if c in special_chars]
counted_chars = Counter(found_chars)

答案 2 :(得分:1)

  • 无需逐行处理文件内容
  • 避免嵌套循环,这会增加程序的复杂性
    • 如果要计算某些字符串中的字符出现次数,首先,循环遍历整个字符串以构造出现字典。然后,您可以从字典中找到任何出现的字符。这降低了程序的复杂性。
      • 构造事件dict时,defaultdict将帮助您初始化计数值。

该程序的重​​构版本如下:

special_chars = list('!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ ')
dict_count = defaultdict(int)

with open(filename) as f:
    for c in f.read():
        dict_count[c] += 1

for c in special_chars:
    print('{0};{1}'.format(c, dict_count[c]))

REF。 defaultdict示例:https://docs.python.org/3.4/library/collections.html#defaultdict-examples

答案 3 :(得分:1)

我做了类似这样的事情,你不需要使用计数器库。我用它来计算所有特殊字符,但你可以适应把计数放在字典中。

import re

def countSpecial(passwd):
    specialcount = 0
    for special in special_chars:
        lenght = 0
        #print special
        lenght = len(re.findall(r'(\%s)' %special , passwd))
        if lenght > 0:
            #print lenght,special
            specialcount = lenght + specialcount
    return specialcount