2017-02-24 47 views
1

我正在通過編寫一些簡單的程序來學習Python。我正在嘗試執行以下操作 -在Python中處理越界/寫入CSV

我有一個xlsx。它的格式爲:

Team, Player 

我想要做的就是應用過濾器的田徑隊,再取每隊3名選手隨機子集。

因此,舉例來說,我XLS樣子:

Man Utd, Ryan Giggs 
Man Utd, Paul Scholes 
Man Utd, Paul Ince 
Man Utd, Danny Pugh 
Liverpool, Steven Gerrard 
Liverpool, Kenny Dalglish 
... 

我想每隊由3名隨機玩家的XLS到結束,只有在有小於1/2的情況下3(這是我掙扎着)。

我已經開始了這一點,像這樣:

import xlrd, random, csv 

# First open the workbook 
wb = xlrd.open_workbook('C:\\Users\\ADMIN\\Desktop\\1.xlsx') 

# Then select the sheet. 
sheet = wb.sheet_by_name('Sheet1') 

# Then get values of each column. Excuse first item which is header 
teams = sheet.col_values(0)[1:] 
players = sheet.col_values(1)[1:] 
filtered_teams = filter(lambda x: x[0] > 2, zip(teams, players)) 

teams = {} 
for t,p in zip(teams,players): 
    if t in teams: 
     teams[t].append(p) 
    else: 
     teams[t] = [p] 


samples = [teams[t] + random.sample(teams[t],3) for t in teams] 
myFile = open('C:\\Users\\ADMIN\\Desktop\\1.csv', 'wb') 
wr = csv.writer(myFile, quoting=csv.QUOTE_ALL) 
wr.writerow(samples) 

我遇到的問題 -

wr.writerow(samples) 
TypeError: a bytes-like object is required, not 'str' 

我需要做一些明確的在這裏投?我怎樣才能解決這個問題?

此外,在創建樣本外,所有強隊之列/播放器時,如果我使用:

samples = [teams[t] + random.sample(teams[t],1) for t in teams] 

它會工作,但如果我使用:

samples = [teams[t] + random.sample(teams[t],3) for t in teams] 

我得到一個出來的因爲有些球隊沒有3名球員(只有1名球員)。確切地說,我得到:

raise ValueError("Sample larger than population or is negative") 
ValueError: Sample larger than population or is negative 

(我簡單的Java大腦已經理解爲OOB)。

我該如何解決這個問題/讓它在此時移動到下一個團隊?某種嘗試{轉讓} {轉移到下一個團隊}機制。

任何人都可以提供任何反饋/建議嗎?

謝謝!

編輯:

被拋出由下面讓·弗朗索瓦·法布爾得到解決的錯誤,非常感謝你。不過,現在,當我寫CSV,它只返回17行(應該有幾百個),格式是完全錯誤的......我希望寫類似:

Man Utd, Ryan Giggs 
Man Utd, Paul Scholes 
Man Utd, Danny Pugh 
Liverpool, Steven Gerrard 
Liverpool, Kenny Dalglish 

,但它似乎只是玩家得到回報,沒有任何真正的訂購?事實上,如果我將其更改爲random.sample(teams[t],min(2,len(teams[t]))我仍然有5/6球員每隊返回...

任何想法我的邏輯錯誤可能在這裏?

+0

@SergeBallesta我不認爲我是,我只是想打印到CSV :) –

回答

2

嗯,這是一個不知何故2(現在3 :))的問題之一。由於我對所有這些答案,我會跳:

myFile = open('C:\\Users\\ADMIN\\Desktop\\1.csv', 'wb') 

僅適用於Python的2.對於蟒蛇3你要打開在文本模式(也可能需要添加newline=""避免僞線空格:

myFile = open('C:\\Users\\ADMIN\\Desktop\\1.csv', 'w', newline="") 

和您的其他問題,只是改變:

random.sample(teams[t],3) 

random.sample(teams[t],min(3,len(teams[t])) 

所以你總是範圍之內。現在

,對丟棄的輸出,你要創建一個列表的列表,但你只使用writerow寫一行。這震驚了我在第一,但後來我忘了:)使用writerows代替,否則你會得到只有一行表示爲字符串列表,用括號,逗號......

另一個最後一個問題:團隊信息從文件中丟失,因爲您只生成玩家名稱。

概括起來我已經重寫這樣整個事情的一些改進:

samples = [[team] + players + random.sample(players,min(3,len(players)) for team,players in teams.items()] 
with open(r'C:\Users\ADMIN\Desktop\1.csv', 'w', newline='') as myFile: 
    wr = csv.writer(myFile, quoting=csv.QUOTE_ALL) 
    wr.writerows(samples) 
+0

@JeanFrançoisFabre非常感謝你的迴應。這解決了編譯器的所有錯誤,所以程序運行...但意想不到的結果。我只有17行,有幾百列的每一行,而且他們似乎並不以任何方式來組織。任何想法可能會造成這種情況?我會更新這個問題。 –

+0

哦,我明白了,我想你需要'writerows'不'writerow'。試試看,我會相應地編輯我的答案。編輯,我相信這是問題所在。然而 –

+0

,比較你的期望的輸出,我不知道:你總是首先需要球隊的名字,但你永遠不輸出它在你的'samples'。也許我們應該將關鍵值添加到值中。和預期輸出你提到的是「隊名,玩家」的每一行,這是不可能與當前'random.sample'哪些問題4+的球員......所以似乎有其他問題。 –