2012-05-13 21 views
1

我有一個評估做的,這是我到目前爲止的代碼:從csv中檢索數據,並將行x和列y的值分配給變量。 Py3.2,*功課*

number1 = input("Number1? ") 

number2 = input("Number2? ") 

packages = csv.reader(open('lol.txt', newline='\n'), delimiter=',') 
for PackName,PriceAdultString,PriceChildString in packages: 
    n += 1 
    PriceAdult = float(PriceAdultString) 
    PriceChild = float(PriceChildString) 
    print("%i. %17s - $%4.2d/$%4.2d" % (n, PackName, PriceAdult, PriceChild)) 

NameChoice = input("Which name would you like? Choose using a number: ") 

通過csv.reader使用的lol.txt由以下部分組成:

herp,123,456  
derp,321,654  
hurr,213,546 

現在,我需要能夠使用NameChoice從文件中檢索一行,並使用名稱,number1和number2中的數據,因此對於NameChoice == 1,name = herp,number1 = 123和number 2 = 456,並且這些數字必須是浮點數。

我很難解決這個問題,如果可能的話可以使用一些指導。

謝謝大家。

在被問到之前,我意識到我忘了提及:我已經使用Google搜索並通過Python指南和我的教科書進行了瀏覽。不過,我並不完全相信我知道我在找什麼。

潤成一個新的問題: 我需要能夠採取CSV文本用「\ n \ n」而不是「\ n」,所以文字更像是以下幾點:

herp,123,456 

derp,321,654 

hurr,213,546 

代碼立昂的我(非常輕微調整)版本使用:

import csv 
with open ("lol.txt",'rt', newline = '\n\n') as f: 
    csv_r = csv.reader (f) 
    entries = [ (name, float(p1), float(p2)) for name, p1, p2 in csv_r] 

for index, entry in enumerate(entries): 
    print ("%2i. %-10s %5.2f %5.2f" % (index, entry[0], entry[1], entry[2])) 

choice = int(input("Choose a number: ")) 

print (entries[choice]) 

它返回例外:

Traceback (most recent call last): 
    File "C:/Python32/eh", line 2, in <module> 
    with open ("lol.txt",'rt', newline = '\n\n') as f: 
ValueError: illegal newline value: 

現在,調試非常清晰 - '\ n \ n'作爲換行符不可接受,但我想知道是否有解決方法?

注:搞砸了一個編輯,從代碼的調試與「換行=‘\ n’」將是:

Traceback (most recent call last): 
    File "C:/Python32/eh", line 4, in <module> 
    entries = [ (name, float(p1), float(p2)) for name, p1, p2 in csv_r] 
    File "C:/Python32/eh", line 4, in <listcomp> 
    entries = [ (name, float(p1), float(p2)) for name, p1, p2 in csv_r] 
ValueError: need more than 0 values to unpack 

這是因爲它與每一個介於0值處理的空白就像它被告知要做的那樣,一排排有用的排,而且那裏什麼也沒有。

回答

1

存儲整個文件到列表:

import csv 
with open ("lol.txt",'rb') as f: 
    csv_r = csv.reader (f) 
    entries = [ (name, float(p1), float(p2)) for name, p1, p2 in csv_r] 

for index, entry in enumerate(entries): 
    print ("%2i. %-10s %5.2f %5.2f" % (index, entry[0], entry[1], entry[2])) 

choice = int(raw_input("Choose a number: ")) 

print (entries[choice]) 

輸出:

0. herp  123.00 456.00 
1. derp  321.00 654.00 
2. hurr  213.00 546.00 
Choose a number: 0 
('herp', 123.0, 456.0) 
>>> 
+0

謝謝大家, 我覺得我快到了,但是我不打算在這之前關閉這個問題,我已經實施了一切,並檢查了我的工作。 禁止一些擰緊,它應該在4或5小時內關閉(現在是晚上9點,我需要出去半個小時或更長的時間來清理我的頭)。 再次感謝。 當我有能力時,我會爲你投票。 – Epidemic

1

例如,您可以將輸入存儲在list中,而不是將其打印出來。之後是微不足道的獲取從列表中正確的元組,並將其分配給您的變量

...

2

@mata有權利,但我覺得需要詳細闡述他們的答案比我可以在評論中更多。

既然您需要回顧您的數據而不是僅僅打印它,那麼讓它以某種方式堅持是有道理的。一旦你達到這一點,你需要擔心的最重要的事情是使用什麼樣的數據結構 - 如果你選擇的數據結構與你想要如何使用數據完全匹配,代碼就變得非常簡單。

所以,你的邏輯將是這樣的:

  1. 解析數據轉換成某種數據結構
  2. 走這個數據結構的打印出來的菜單
  3. 獲取用戶輸入,並使用它選擇數據

的右位由於用戶輸入多遠下來的數據是文件代表數字,list是一個顯而易見的選擇。如果您使用其中一個現有字段作爲查詢,則dict可以更好地爲您提供服務。

如果你這樣做:

data = list(csv.reader(open('lol.txt', newline='\n'), delimiter=',')) 

,你可以走它來打印菜單以同樣的方式,你當前使用的文件,除了數據支左右,並使用數字你在IS直接有意義。

您可能更願意將數字存儲爲數字類型而不是字符串;這將是很有意義的,但搞清楚如何調整上面的代碼來實現它是作爲讀者的練習。 :-)

0

張開( 「lol.txt」, 'RT',換行符= '\ n \ n')爲f:

它變化到 '\ N'

張開( 「lol.txt」,'rt',newline ='\ n')作爲f:

相關問題