在Python中处理越界/写入CSV

2024-06-16 11:57:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过编写一些简单的程序来学习Python。我正在努力做到以下几点-

我有一个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
... 

我想最终得到一个XLS,由每个队的3个随机球员组成,如果少于3个,则只有1/2(这是我正在努力解决的问题)。你知道吗

我是这样开始的:

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)。你知道吗

我怎样才能解决这个问题/让它在此时转移到下一个团队?某种try{assignment}catch{move to next team}机制。你知道吗

有人能提供任何反馈/建议吗?你知道吗

谢谢你!你知道吗

编辑:

下面的让-弗朗索瓦-法布解决了抛出的错误,非常感谢。但是,现在,当我写入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的球员返回每个队。。。你知道吗

知道我的逻辑错误是什么吗?你知道吗


Tags: csvsampleinforisrandom团队sheet
1条回答
网友
1楼 · 发布于 2024-06-16 11:57:16

好吧,这是一个2个(现在是3:)的问题。既然我都有答案了,我就跳进去:

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

仅适用于Python2。对于python3,您必须以文本模式打开(并且可能必须添加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)

相关问题 更多 >