2016-12-02 96 views
0

我有一个包含有关不同的篮球运动员数据的行csv文件,我知道读行/列我一直在使用下面的代码:如何写一个特定的细胞在CSV文件

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

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

回答

1

通常情况下没有完成。因为它不像CSV文件那样工作。

CSV文件是松散的文本文件,它可以包含每个字段的可变长度空闲信息,前提是所有行中的字段数相同。但是,虽然可以这样指定,但字段长度本身并不固定。例如,在这种情况下,如果您在严格使用您想要的内容的情况下,分数将从“8”更改为“10”,则会覆盖下一个字段分隔符(“,”)并中断该文件。实际上,计算中的任何文本文件通常只是作为信息的“来源” - 并且只要信息发生变化,通常情况下只需要重新编写整个文件(并删除以前的版本)。

这似乎是浪费资源 - 但在操作系统/硬件级别,写入磁盘的最小字节数通常是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() 
+0

(我假设你正在使用Python 3.x的 - 如果你是在Python 2.7版,正确的是“的raw_input “,而不是”输入“ – jsbueno

+0

我不确定你的意思是什么”CSV文件是松散的文本文件,它可以包含每个字段的可变长度免费信息,只要所有行中的字段数相同。“ 'writer.writerows([['a','b',c'],['d','e']])'是完全有效的,并给出了预期的输出。分隔符被指定,为什么字符的数量很重要,因为你只是将分隔符推得更远(参考你保留5个字符空格)? – roganjosh

+0

您可以在每行中写入具有不同字段的文件,只是将它们用作结构化信息将是不现实的。如果有人在这种情况下使用DictReader,读回它将失败。 至于你的第二点 - 如果你进一步推进分隔符会覆盖文件的其他部分。你可能不需要重新编写所有的文件,但是从那时起你必须重写所有的文件。 否则。请只写代码,可以更新CSV格式的单元格,而不会打破它,我会赶上你的。正如所解释的,尽管这样的代码实际上并不是有用的IRL。 – jsbueno