从数据库中解析文件并将信息添加到字典中

时间:2011-12-04 01:54:59

标签: python parsing

我的文本文件如下:

HEADER INFO

Last1, First1       Movie1 (1991) random stuff
                        Movie2 (1992) random stuff
                        Movie3 (1995) random stuff
                        Movie4 (3455) random stuff

Last2, First2       Movie1 (1998) random stuff
                        Movie2 (4568) random stuff
                        Movie3 (2466) random stuff
                        Movie4 (4325) random stuff
                        Movie5 (4875) random stuff
                        Movie6 (3525) random stuff
                        Movie7 (4567) random stuff

FOOTER INFO

它还包含一些我可以跳过的页眉/页脚信息。名称和电影之间的空格不是恒定的。我想使用while循环将这些数据添加到字典中(整个过程没有循环)。基本上,名称将作为键,以下电影的列表将是值(两者都是字符串)。到目前为止,我可以获得包含名称的行或包含电影的行。我尝试使用if语句让它工作但无济于事。

基本上我正在考虑使用if语句来说明该行是否包含该行的某些特征的名称,然后拼接出名称并拼接出电影并添加到字典中。如果名称不在该行中,则将该影片与相同名称(多个条目)相关联。但我认为这是我迷失的地方。这部分也许是我如何迭代while循环。

我没有使用任何readline()。相反,我使用readlines(),我用它来切换线来挑选信息。我只是想知道是否有人可以提供任何提示/提示。

如果有人想要我正在使用的实际数据,请发给我。

生病了:

CRC: 0xDE308B96  File: actors.list  Date: Fri Aug 12 00:00:00 2011

Copyright 1990-2007 The Internet Movie Database, Inc.  All rights reserved.

COPYING POLICY: Internet Movie Database (IMDb)
==============================================

CUTTING COPYRIGHT NOTICE

THE ACTORS LIST
===============

Name                    Titles
----                    ------
ActA, A                 m1 (2011)
                            m2 (2011)

ActB, B                 m1 (2011)
                            m2 (2011)
                            m3 (2001)

ActC, C                 m1 (2011)

ActD, D                 m3 (2003)
                            m6 (2006)

ActE, E                 m6 (2006)

ActF, F                 m4 (2004)

ActG, G                 m4 (2004)

ActH, H                 m5 (2005)

Bacon, Kevin            m2 (2011)
                        m5 (2005)

-----------------------------------------------------------------------------
SUBMITTING UPDATES
==================

CUTTING UPDATES

For further info visit http://www.imdb.com/licensing/contact

基本上我希望输出为字典:

{'E Acte': ['m6 (2006)'],
'A Acta': ['m1 (2011)', 'm2 (2011)'],
'G Actg': ['m4 (2004)'],
'B Actb': ['m1 (2011)', 'm2 (2011)', 'm3 (2001)'],
'D Actd': ['m3 (2003)', 'm6 (2006)'],
'F Actf': ['m4 (2004)'],
'Kevin Bacon': ['m2 (2011)', 'm5 (2005)'],
'H Acth': ['m5 (2005)'],
'C Actc': ['m1 (2011)']}

我建议使用while循环,因为它会使过程更容易,但不仅限于它。

2 个答案:

答案 0 :(得分:0)

这是一个带有for循环的解决方案,在Python中更自然。它假设输入文件使用空格格式化,就像上面问题中发布的代码一样。我现在已经发布了一个替代答案,用于使用制表符而不是空格格式化列表的情况。

当然你可以将它重写为while循环,但它没有多大意义。您还可以通过在较新的Python版本中使用defaultdict(list)来简化它。

output = {}

pos = -1 # char position of title column
current_name = None

for line in open('actors.list'):
    if pos < 0:
        if line.startswith('-'):
            pos = line.find(' ')
            if pos > 0:
                pos = line.find('-', pos)
    else:
        if line.startswith('-'):
            break
        name = line[:pos].strip()
        title = line[pos:].strip()
        if name:
            if ',' in name:
                name = name.split(',', 1)
                name[0] = name[0].rstrip()
                name[1] = name[1].lstrip()
                name.reverse()
                name = ' '.join(name)
            current_name = name
        if title:
            output.setdefault(
                current_name, []).append(title)

print output

答案 1 :(得分:0)

这是使用制表符而不是空格格式化列表时的另一种解决方案:

output = {}

in_list = False
current_name = None

for line in open('actors.list'):
    if in_list:
        if line.startswith('-'):
            break
        if '\t' not in line:
            continue
        name, title = line.split('\t', 1)
        name = name.strip()
        title = title.strip()
        if name:
            if ',' in name:
                name = name.split(',', 1)
                name[0] = name[0].rstrip()
                name[1] = name[1].lstrip()
                name.reverse()
                name = ' '.join(name)
            current_name = name
        if title:
            output.setdefault(
                current_name, []).append(title)
    else:
        if line.startswith('-'):
            in_list = True