以来自IANA的这种格式为例: http : //www.iana.org/assignments/language-subtag-registry

%%
Type: language
Subtag: aa
Description: Afar
Added: 2005-10-16
%%
Type: language
Subtag: ab
Description: Abkhazian
Added: 2005-10-16
Suppress-Script: Cyrl
%%
Type: language
Subtag: ae
Description: Avestan
Added: 2005-10-16
%%

说我打开文件:

import urllib
f = urllib.urlopen("http://www.iana.org/assignments/language-subtag-registry")
all=f.read()

通常你会这样

lan=all.split("%%") 

迭代lan和split("\\n")然后迭代结果和split(“:”),有一种方法可以在python中批量进行而无需迭代,并且输出仍然是这样的: [[["Type","language"],["Subtag", "ae"],...]...]

#1楼 票数:3

如果每次拆分后要访问的元素在语义上有所不同,那么尝试单步执行此操作就没有任何意义。

您可以先以“:”分割-这将使您获得细粒度的数据-但是,如果您不知道该数据属于什么,那会有什么好处?

就是说,您可以将所有级别的分离放置在生成器中,并使其与数据一起产生字典对象,以备考虑:

def iana_parse(data):
    for record in data.split("%%\n"):
        # skip empty records at file endings:
        if not record.strip():
            continue
        rec_data = {}
        for line in record.split("\n"):
            key, value = line.split(":")
            rec_data[key.strip()] = value.strip()
        yield rec_data

可以按照您在注释中的要求将其作为一个衬纸来完成-但正如我评论说的那样,可以将其编写为适合单个表达式的一行。 比上面的示例花费更多的时间来编写,并且几乎不可能维护。 上面示例中的代码将逻辑放到几行代码中,这些代码“放在一边”(即不与您实际数据一起使用的地方是内联的),为这两项任务提供了可读性和可维护性。

也就是说,可以按照需要将其解析为嵌套列表的结构:

structure = [[[token.strip() for token in line.split(":")] for line in record.split("\n") ] for record in data.split("%%") if record.strip() ]

#2楼 票数:3 已采纳

作为一个单一的理解:

raw = """\
%%
Type: language
Subtag: aa
Description: Afar
Added: 2005-10-16
%%
Type: language
Subtag: ab
Description: Abkhazian
Added: 2005-10-16
Suppress-Script: Cyrl
%%
Type: language
Subtag: ae
Description: Avestan
Added: 2005-10-16
%%"""


data = [
     dict(
         row.split(': ')
         for row in item_str.split("\n")
         if row  # required to avoid the empty lines which contained '%%'
     )
     for item_str in raw.split("%%") 
     if item_str  # required to avoid the empty items at the start and end
]
>>> data[0]['Added']
'2005-10-16'

#3楼 票数:2

正则表达式 ,但我不明白这一点:

re.split('%%|:|\\n', string)

在这里,多个模式使用或|链接| 操作员。

#4楼 票数:2

您可以使用itertools.groupby

ss = """%%
Type: language
Subtag: aa
Description: Afar
Added: 2005-10-16
%%
Type: language
Subtag: ab
Description: Abkhazian
Added: 2005-10-16
Suppress-Script: Cyrl
%%
Type: language
Subtag: ae
Description: Avestan
Added: 2005-10-16
"""
sss = ss.splitlines(True) #List which looks like you're iterating over a file object


import itertools

output = []
for k,v in itertools.groupby(sss,lambda x: x.strip() == '%%'):
    if(k):  #Hit a '%%' record.  Need a new group.
        print "\nNew group:\n"
        current = {}
        output.append(current)
    else:   #just a regular record, write the data to our current record dict.
        for line in v:
            print line.strip()
            key,value = line.split(None,1)
            current[key] = value

此答案的一个好处是它不需要您读取整个文件。 整个表达式是惰性计算的。

  ask by Eduard Florinescu translate from so

未解决问题?本站智能推荐:

14回复

大多数pythonic方式交错两个字符串

将两个字符串拼接在一起的最pythonic方法是什么? 例如: 输入: 输出:
4回复

Pythonic解析这个字符串的方法?

我正在解析这一line - 基本上,我需要 - 我这样做, 我不相信我所做的是最狡猾的做法,有更优雅的方式吗? 也许一个正则表达式的单行程?
3回复

格式化字符串的大多数pythonic方法

问题: 我需要从不同的部分( nbsp = u'\\xa0', data['text'], delimeter )创建一个复杂的字符串。 我知道3种常见的解决方案: 旧的%字符串格式化方法还有另一种方法,但看起来它已成为一种传统方法。 那么,在这种情况下,哪一个最适合python
1回复

Pythonic将整数转换为字符串的方法

将整数转换为字符串的Pythonic方法是哪种? 我一直在使用第一种方法,但我现在发现第二种方法更具可读性。 有实际的区别吗?
2回复

基于“\\”的python字符串拆分

我必须根据"\\"分解以下字符串。 该探针是, string.split('\\')不起作用,而re.split("\\/",text) 。 我不知道。 字符串很简单 第一部分有时会更长。
2回复

从较大字符串中提取所需子字符串的pythonic方法

我有这样的字符串 字符串{"PUID":"9279565","Title":"Risk Manager","Description":"<strong>Risk Manager </strong><br />\\\\n<br />\\\\nLe
1回复

pythonic替换字符串开头或结尾的特殊字符的方法

我有一个像这样的字符串'- 36 x 45 x 2.75-size-' 。 我想删除此字符串开头的特殊字符('','-'等)。 我实现了一个肮脏的方法来实现这一目标 但是我正在寻找一种更有效/优化的方法来实现这一目标
8回复

将Python字符串拆分为对列表

我有以下格式的数据: 我想做的是将其拆分为一个列表,以便将值和单位组合在一起,例如: 当然,在Python 2.7中,我可以用这种方式做到这一点: 但我希望有一个更优雅的方式来做到这一点?