【问题标题】:Append values from csv file to a list and then sort将 csv 文件中的值附加到列表中,然后排序
【发布时间】:2022-01-04 22:07:01
【问题描述】:

我有一个包含两列的简单 csv 文件。我想为 csv 文件添加一个额外的名称和分数,然后按分数对 csv 文件进行排序。

我试图创建一个 2d 列表并添加新项目,将其与原始 csv 文件中的项目组合,使用 lambda 对 2d 列表进行排序,然后用新的排序列表覆盖 csv 文件。 (我不知道这是否是最有效的方法。)

它对相同的值进行排序,例如3 位数字,但如果我输入 4 位数字,似乎无法排序。

import csv


tmp = []
tmp2 = []

tmp.append([])
NameOfPlayer = input("Please enter name of player:\n")
PlayerScore = input("Please eneter score:\n")

tmp[0].append(NameOfPlayer)
tmp[0].append(PlayerScore)

print(tmp)
datafile = open('scores.csv', 'r')
datareader = csv.reader(datafile, delimiter=',')


for line in datareader:
    tmp.append(line)

sort = sorted(tmp, key=lambda x: x[1], reverse=True)

for line in sort:
    tmp2.append(line)
datafile1 = open('scores.csv', 'w')
x = 0
for row in tmp2:
    newRec = tmp2[x][0] + "," + tmp2[x][1] + "\n" 
    x = x + 1
    datafile1.write(newRec)
datafile1.close()

【问题讨论】:

  • 我看不出这段代码如何区分 3 位数字和 4 位数字。不过,它会按字典顺序排序,而不是按数字排序,因为您永远不会将从 CSV 文件中读取的数据转换为数字。
  • replit有可能出错吗?
  • 很可能不会。
  • 您可能需要将输入从字符串更改为整数。例如,在第一个 for 循环中,您可以尝试 tmp.append(list(map(float,line)))
  • @BenGrossmann 这将转换为float,而不是整数。

标签: python csv


【解决方案1】:

您是否考虑过使用 pandas 模块? 它使许多平面文件杂技变得非常简单。 这是文档:https://pandas.pydata.org/docs/index.html

例如,您可以像这样导入 csv:

import pandas as pd
player_df = pd.read_csv("../players_data.csv")

在这种情况下,如果您想附加新记录,您只需将字典附加到数据框对象(由 csv 制成),并带有列名(应该在第一行.csv 文件)作为键,新值作为字典值。假设您的列名是“名称”和“分数”:


player_name = input(" Please enter name of player:\n")
player_score = input("Please enter score:\n")

player_data = {
"Name":player_name,
"Score":player_score
}

player_df.append(player_data, ignore_index=True)

按列(分数)排序同样简单:

player_df.sort_values(by='Score', inplace=True)

如果您想再次将 .csv 保存到磁盘:

player_df.to_csv("../players_data.csv")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 2021-01-11
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多