2016-12-02 70 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

相關問題