2013-08-06 173 views
0

Python 3程序允許用戶從員工姓名列表中進行選擇。 數據上的文本文件看起來像這樣認爲:(「拉里」,3,100) (正的人的名字,周工作,並支付)從文本文件中讀取數據並將數據分配給新變量

我需要一種方法來將文本文件的各個部分分配給一個新的變量 ,以便用戶可以輸入新的週數,程序將計算新的付款。

下面是我的代碼,並試圖找出它。

import os 
choices = [f for f in os.listdir(os.curdir) if f.endswith(".txt")] 
print (choices) 
emp_choice = input("choose an employee:") 

file = open(emp_choice + ".txt") 

data = file.readlines() 
name = data[0] 
weeks_worked = data[1] 
weekly_payment= data[2] 

new_weeks = int(input ("Enter new number of weeks")) 
new_payment = new_weeks * weekly_payment 
print (name + "will now be paid" + str(new_payment)) 

回答

0

當前正在分配的前三行形成文件nameweeks_workedweekly_payment。但你想要的(我認爲)是分開一行,格式爲('larry', 3, 100)(每個文件只有一行?)。

所以你可能想這樣的代碼:

from re import compile 

# your code to choose file 

line_format = compile(r"\s*\(\s*'([^']*)'\s*,\s*(\d+)\s*,\s*(\d+)\s*\)") 
file = open(emp_choice + ".txt") 
line = file.readline() # read the first line only 
match = line_format.match(line) 
if match: 
    name, weeks_worked, weekly_payment = match.groups() 
else: 
    raise Exception('Could not match %s' % line) 

# your code to update information 

正則表達式看起來很複雜,但其實非常簡單:

\(...\) matches the parentheses in the line 
\s*  matches optional spaces (it's not clear to me if you have spaces or not 
     in various places between words, so this matches just in case) 
\d+  matches a number (1 or more digits) 
[^']* matches anything except a quote (so matches the name) 
(...) (without the \ backslashes) indicates a group that you want to read 
     afterwards by calling .groups() 

和這些都是從簡單的部分建(如*+\d),其描述在http://docs.python.org/2/library/re.html

如果你想重複是很多行,你可能想要類似的東西:

name, weeks_worked, weekly_payment = [], [], [] 
for line in file.readlines(): 
    match = line_format.match(line) 
    if match: 
     name.append(match.group(1)) 
     weeks_worked.append(match.group(2)) 
     weekly_payment.append(match.group(3)) 
    else: 
     raise ... 
+0

是否沒有一種方法有一個for循環,查看文本文件中的每個元素併爲其指定一個索引號。那麼我的變量可以匹配索引號? –

+0

請參閱額外編輯。 –

相關問題