我正在通過編寫一些簡單的程序來學習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球員每隊返回...
任何想法我的邏輯錯誤可能在這裏?
@SergeBallesta我不認爲我是,我只是想打印到CSV :) –