在 python 中排序 table

Sorting a table in python

我正在为 6 人制足球联赛创建联赛 table,我试图按积分列对其进行排序,然后在 easygui 中显示它。到目前为止我的代码是这样的:

data = csv.reader(open('table.csv'), delimiter = ',')
sortedlist = sorted(data, key=operator.itemgetter(7))
with open("Newtable.csv", "wb") as f:
          fileWriter = csv.writer(f, delimiter=',')
          for row in sortedlist:
              fileWriter.writerow(row)
              os.remove("table.csv")
              os.rename("Newtable.csv", "table.csv")
              os.close

数字 7 与我的 csv 文件中的点列相关。我对 Newtable 有问题,它只包含具有最高分的团队信息,而 table.csv 显然正被另一个进程使用,因此无法删除。

如果有人对如何解决此问题有任何建议,我们将不胜感激。

如果 post 中的缩进实际上是脚本中的缩进(而不是复制粘贴错误),那么问题就很明显了:

os.rename()for 循环期间执行(这意味着它在 CSV 文件中每行调用一次!),在 Newtable.csv 仍然打开的时间点(不是通过不同的进程,而是通过您的脚本本身),因此操作失败。

顺便说一下,您不需要关闭 f - with 语句会为您处理。您做的需要关闭的是data——调用发生时该文件仍然打开。

最后,由于csv对象包含字符串,而字符串是按字母顺序排序的,而不是按数字排序的(所以"10"排在"2"之前),你需要根据数字排序字符串的值,而不是字符串本身。

你可能想做类似的事情

with open('table.csv', 'rb') as infile:
    data = csv.reader(infile, delimiter = ',')
    sortedlist = [next(data)] + sorted(data, key=lambda x: int(x[7])) # or float?
    # next(data) reads the header before sorting the rest
with open("Newtable.csv", "wb") as f:
    fileWriter = csv.writer(f, delimiter=',')
    fileWriter.writerows(sortedList)          # No for loop needed :)
os.remove("table.csv")
os.rename("Newtable.csv", "table.csv")

我建议使用 pandas:

假设输入文件如下:

team,points
team1, 5
team2, 6
team3, 2

你可以这样做:

import pandas as pd
a = pd.read_csv('table.csv')
b=a.sort('points',ascending=False)
b.to_csv('table.csv',index=False)