使用python将.txt文件视为大字符串,并迭代文件中的每个{}

时间:2014-05-20 00:12:39

标签: python loops python-2.7 for-loop

我有一个data.txt和一个count.py。

我在data.txt中的数据看起来像这样:

hermione [
  {
   keyword.adsf
   keyword.bsdf
  },
  {
   keyword.1sdf
   keyword.bsd
   keyword.bsd
  }
  ]
ron [
  {
   keyword.adsf
   keyword.bsdf
  },
  {
   keyword.1sdf
   keyword.bsd
   keyword.bsd
  }
  ]

我想要做的是使用python计算每个{}内keyword.xxx个出现次数。换句话说,我希望我的输出是这样的:

hermione [
  {
   2
  },
  {
   3
  }
  ]
ron [
  {
   2
  },
  {
   3
  }
  ]

我想在count.py中,我会写脚本来计算,并将data.txt视为一个大字符串。

到目前为止,这是我编写的代码:

from sys import argv
script, filename = argv
txt = open(filename).read()
def count_in_bracket():
    print txt
print count_in_bracket()

(我在终端中运行python custom_fields_nocount.py custom_fields_nocount.txt。)

...这并不多,因为它不会遍历每个{}括号。

这是我无法搞清楚的部分。我怎么写像

这样的东西
list = ['ron', 'hermione']
for {} in list:
    print len(CONTENTS_OF_EACH_{}.split("keyword"))-1

2 个答案:

答案 0 :(得分:1)

使用正则表达式,您可以:

import re

contents_of_each = re.findall('{([^}]+?)}', txt, re.DOTALL)

这将为您提供一个列表,其中包含{}

之间的每个字符串

它是如何工作的:它搜索一个开放的卷曲,然后是一个或多个不是接近卷曲的字符的序列,然后是一个接近卷曲的字符,但只返回括号内的字符。

re.DOTALL将换行视为常规字符,匹配跨越多行的卷对。

答案 1 :(得分:1)

这是使用纯Python做到这一点的一种方法。如果您需要更复杂的处理而不仅仅是计算事物,这可能会很方便。

import sys

def prn(s):
    sys.stdout.write(str(s))

def _parse_list(f, line):
    if line.strip() != '{':
        raise ValueError("list part must start with '{'")
    prn(line)

    count = 0
    found_list_end = False
    for line in f:
        if line.strip().startswith('}'):
            found_list_end = True
            break
        count += 1
    if not found_list_end:
        raise ValueError("list part must end with '}'")
    prn("    {}\n".format(count))
    prn(line)


def parse_section(f):
    found_section_start = False
    for line in f:
        prn(line)
        words = line.split()
        if len(words) == 2 and words[1] == '[':
            found_section_start = True
            break
    if not found_section_start:
        return False  

    for line in f:
        if line.strip() == ']':
            prn(line)
            return True
        _parse_list(f, line)
    return True

with open("data.txt", "rt") as f:
    while parse_section(f):
        pass