2012-12-15 63 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