2012-12-15 33 views
0

我有一个纯文本文件,其中包含一些数据,我试图打开并使用Python(ver 3.2)程序读取,并试图将该数据加载到数据结构中程序。在Python中分析输入文件

这里就是我的文本文件看起来像(文件名为“data.txt中”)

NAME: Joe Smith 
CLASS: Fighter 
STR: 14 
DEX: 7 

这是我的计划是什么样子:

player_name = None 
player_class = None 
player_STR = None 
player_DEX = None 
f = open("data.txt") 
data = f.readlines() 
for d in data: 
    # parse input, assign values to variables 
    print(d) 
f.close() 

我的问题是,我该怎么办将值赋给变量(如在程序中设置player_STR = 14)?

回答

2
player = {} 
f = open("data.txt") 
data = f.readlines() 
for line in data: 
    # parse input, assign values to variables 
    key, value = line.split(":") 
    player[key.strip()] = value.strip() 
f.close() 

现在你的球员的名字将是player['name'],同样也适用于您的文件中的所有其他属性。

1
import re 

pattern = re.compile(r'([\w]+): ([\w\s]+)') 

f = open("data.txt") 
v = dict(pattern.findall(f.read())) 
player_name = v.get("name") 
plater_class = v.get('class') 
# ... 


f.close() 
+0

为什么要通过用正则表达式搜索整个文件的麻烦,如果你知道文件的格式将成为每一行上的一个关键:值对? – bigblind

+0

你是否运行过这段代码?它什么都没发现。因为'“名字:乔·史密斯”!=“名字:乔·史密斯”' – akaRem

1

最直接的方式做到这一点是分配在一个时间变量之一:

f = open("data.txt")    
for line in f:      # loop over the file directly 
    line = line.rstrip()    # remove the trailing newline 
    if line.startswith('NAME: '): 
     player_name = line[6:] 
    elif line.startswith('CLASS: '): 
     player_class = line[7:] 
    elif line.startswith('STR: '): 
     player_strength = int(line[5:]) 
    elif line.startswith('DEX: '): 
     player_dexterity = int(line[5:]) 
    else: 
     raise ValueError('Unknown attribute: %r' % line) 
f.close() 

也就是说,大多数Python程序员将存储在一个字典,而不是变量的值。这些字段可以被删除(删除行结尾),并分割为:characteristic, value = data.rstrip().split(':')。如果值应该是数字而不是字符串,请将其转换为float()int()

+0

为了表现,将字段赋值给变量已经?类似于剥离名称,并将数字/字符串分配给名称与剥离字符串相同的对象中的字段。这会起作用吗? –

+0

表演在这里是红鲱鱼。 OP的任务是IO绑定,所以读取文件的时间主宰了处理过程。另外,直接变量赋值使用场景后面的字典(全局变量),所以两种方法之间没有任何本质区别。 –

+0

如果'DEX:14'或'dex:14'会怎么样?这将是未知的attr,但它真的是未知的? – akaRem