我的文本文件如下:
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循环,因为它会使过程更容易,但不仅限于它。
答案 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