如何写入csv文件中的特定单元格

时间:2016-12-02 08:49:03

标签: python file csv append

我有一个csv文件,其中包含有关不同篮球运动员的数据行,我知道要阅读一行/列,我一直在使用以下代码:

with open(playerDocument) as csvfile:
     reader = csv.DictReader(csvfile)
     for row in reader:
          if row["Name"] == "Jerrold":
               print(row["Name"])

如何将2添加到csv文件中的特定单元格?

1 个答案:

答案 0 :(得分:1)

通常情况并非如此。因为它不是因为CSV文件可以工作。

CSV文件是松散的文本文件,如果所有行中的字段数相同,则可以包含每个字段的可变长度免费信息。但是,尽管可以这样指定,但字段长度本身并不固定。在这种情况下,例如,当分数从" 8"如果您严格按照自己的意愿使用,则会覆盖下一个字段分隔符(",")并中断文件。

实际上,计算中的任何文本文件通常都是指"来源"仅限信息 - 每当信息发生变化时,通常要做的就是重新写入整个文件(并删除以前的版本)。

这似乎是浪费资源 - 但在操作系统/硬件级别,写入磁盘的最小字节数通常是4096。这意味着即使您管理创建程序以更改磁盘上的单个字符,记录它仍然会将4000多个字节写回磁盘。

在这种情况下,最常用的方法是:(1)为每次改变重新创建整个文件 - 这对于几百名篮球运动员来说不会成为问题。

(2)如果你有超过几百(或者比每个玩家的单个分数更多的信息),最好的方法是拥有一个SQL数据库 - 并让数据库控制器负责解决正确的问题单元格并最有效地在磁盘上更新它。实际上,即使记录很少,数据库方法也可能很好。在Python中,您可以拥有一个sqlite - 单个文件,自包含数据库 - 没有配置而不是软件安装。

(3) 可能有一个CSV文件,例如,每个单元最少保留5位数,并且它们使用复杂的技术来更新这些单元。它不会节省计算机资源(见上文),并且会使程序的维护变得复杂。但是,了解有关编程以及文件如何工作的更多信息可能会很棒 - 作为练习。

所以 - 这是使用方法(1)的最小程序的样子:

import csv
import os

player_file = "players.csv"
fieldnames = None
def get_data(playerDocument):
    """
    Reads in the whole CSV file as a single dictionary, having the player name as key.
    """
    global fieldnames
    with open(playerDocument) as inputfile:
        reader = csv.DictReader(inputfile)
        fieldnames = reader.fieldnames
        return  {record["Name"]:record  for record in reader}


def update_record(data, player_name, amount=2):
    data[player_name]["Score"] += amount


def save_data(playerDocument, data):
    temp_name = playerDocument + ".temp"
    with open(temp_name, "wt") as outputfile:
        writer = csv.DictWriter(outputfile)
        writer.writeheader(fieldnames)
        writer.writerows(sorted(data.values(), key=lambda record: record["Name"]))
    os.unlink(playerDocument)
    os.rename(temp_name, playerDocument)

def main():
    player = input("Player name to update: ")
    data = get_data(player_file)
    upate_record(data, player)
    save_data(player_file)

main()