如何在Python中的CSV文件中附加新值?

2024-09-27 20:16:06 发布

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

我有一个CSV表,有如下数据:

| not used | Day 1 | Day 2 |
| Person 1    | Score | Score |
| Person 2    | Score | Score |

但是有更多的行和列。每天我都能得到每个人进步的程度,我把这些数据作为字典,其中键是名字,值是分数

问题是,有时字典会包括新的人,而不包括已经存在的人。然后,如果一个新的人来了,它会像前一天一样加0,如果dict不包括已经存在的人,它会给他当天0分

我解决这个问题的想法是在该CSV文件上执行lines=file.readlines(),使用

for line in lines:
   names.append(line.split(",")[0])

然后复制行(换行=行) 检查dict的键,看看那个人是否已经在csv中,如果已经在csv中,则在后面加上逗号 但我被困在了0分的加分部分 任何帮助或贡献都将不胜感激

在我吃这个之前

-,day1,day2,day3
Mark,1500,0,1660
John,1800,1640,0
Peter,1670,1680,1630
Hannah,1480,1520,1570

我还有这本字典要补充

{'Mark': 1750, 'Hannah':1640, 'Brian':1780}

结果应该是

-,day1,day2,day3,day4
Mark,1500,0,1660,1750
John,1800,1640,0,0
Peter,1670,1680,1630,0
Hannah,1480,1520,1570,1640
Brian,0,0,0,1780

看看Brian是如何出现在dict中而不是之前的csv中的,他在其他任何一天的得分都是0。我发现一行.split(',')将给出一个N个元素的列表,其中N-2将是那个人第一天之前要添加的零分数量


Tags: csv数据字典linedictpersonsplitscore
1条回答
网友
1楼 · 发布于 2024-09-27 20:16:06

这在pandas中作为外部联接很容易做到。将CSV读入数据框,并从字典生成新的数据框。连接几乎是您想要的,只是因为为空单元格插入了非数字值,所以需要用零填充NaN,并将所有内容重新转换为整数

一个潜在的问题是CSV被排序。您不需要简单地将新行追加到底部

import pandas as pd
import errno
import os

INDEX_COL = "-"

def add_days_score(filename, colname, scores):
    try:
        df = pd.read_csv(filename, index_col=INDEX_COL)
    except OSError as e:
        if e.errno == errno.ENOENT:
            # file doesn't exist, create empty df
            df = pd.DataFrame([], columns=[INDEX_COL])
            df = df.set_index(INDEX_COl)
        else:
            raise
    new_df = pd.DataFrame.from_dict({colname:scores})
    merged = df.join(new_df, how="outer").fillna(0).astype(int)
    try:
        merged.to_csv(filename + ".tmp", index_label=[INDEX_COL])
    except:
        raise
    else:
        os.rename(filename + ".tmp", filename)
    return merged

#============================================================================
# TEST
#============================================================================

test_file = "this_is_a_test.csv"
before = """-,day1,day2,day3
Mark,1500,0,1660
John,1800,1640,0
Peter,1670,1680,1630
Hannah,1480,1520,1570
"""

after = """-,day1,day2,day3,day4
Brian,0,0,0,1780
Hannah,1480,1520,1570,1640
John,1800,1640,0,0
Mark,1500,0,1660,1750
Peter,1670,1680,1630,0
"""

test_dicts = [
    ["day4", {'Mark': 1750, 'Hannah':1640, 'Brian':1780}],
]

open(test_file, "w").write(before)

for name, scores in test_dicts:
    add_days_score(test_file, name, scores)

print("want\n", after, "\n")
got = open(test_file).read()
print("got\n", got, "\n")
if got != after:
    print("FAILED")

相关问题 更多 >

    热门问题