2011-08-31 48 views
2

我有一個將新數據添加到csv文件的函數。我有點工作。但是,我遇到了一些問題。通過Python將數據添加到CSV文件

  1. 當我添加新值(name, phone, address, birthday)時,它將它們全部添加到一列中,而不是同一行中的單獨列。 (關於如何將它們分成不同列的想法不多)
  2. 我只能添加數字而不是字符串值。所以如果我寫add_friend(blah, 31, 12, 45),它會回來說blah沒有定義。但是,如果我編寫add_friend(3,4,5,6),它會將它添加到新行中,但將它添加到單個列中
  3. 該功能的目標是:如果嘗試添加已在csv中的朋友(比如說Bob) ,他的地址,電話,生日都已經在csv,如果你add_friend(Bob, address, phone, birthday),應該說明False,而不是加上它。但是,我不知道如何做到這一點。有任何想法嗎?

這裏是我的代碼:

def add_friend (name, phone, address, birthday): 
    with open('friends.csv', 'ab') as f: 
     newrow = [name, phone, address, birthday] 
     friendwriter = csv.writer(open('friends.csv', 'ab'), delimiter=' ', 
            quotechar='|', quoting=csv.QUOTE_MINIMAL) 
     friendwriter.writerow(newrow) 
     #friendreader = csv.reader(open('friends.csv', 'rb'), delimiter=' ', quotechar='|') 
     #for row in friendreader: 
     #print ' '.join(row) 

    print newrow 
+1

@Steven嚴重的是,你可能已經更新了[你的其他問題](http://stackoverflow.com/q/7242849/906442),這確實是一個完全相同的問題。最好將它們放在一起,這樣每個人都可以幫助你順利解決問題。我投票合併。 –

回答

4

根據您的要求,以及您似乎正在嘗試做的事情,我寫了以下內容。它應該足夠冗長以便可以理解。

閱讀CSV文件時,您需要與分隔符和其他屬性保持一致。

同時,嘗試並移動"friends.csv"一個全球性的,或者至少在一些非硬編碼不變。

import csv 

def print_friends(): 
    reader = csv.reader(open("friends.csv", "rb"), delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
    for row in reader: 
     print row 

def friend_exists(friend): 
    reader = csv.reader(open("friends.csv", "rb"), delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
    for row in reader: 
     if (row == friend): 
      return True 
    return False 

def add_friend(name, phone, address, birthday): 
    friend = [name, phone, address, birthday] 
    if friend_exists(friend): 
     return False 

    writer = csv.writer(open("friends.csv", "ab"), delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
    writer.writerow(friend) 
    return True 

print "print_friends: " 
print_friends() 

print "get_friend: " 
test_friend = ["barney", "4321 9876", "New York", "2000"] 
print friend_exists(test_friend) 

print "add_friend: " 
print add_friend("barney", "4321 9876", "New York", "2000") 
1
  1. 它沒有做到這一點。是什麼讓你覺得這就是它的作用?有可能您真的需要的報價方案不是您爲csv.writer指定的報價方案:即空格分隔列,|是引用字符。
  2. blah不是字符串文字,"blah"是。不帶引號的blah是變量引用,並且此處不存在該變量。
  3. 爲了檢查名稱是否已經存在於CSV文件中,您必須先讀取整個CSV文件,然後檢查詳細信息。打開文件兩次:首先閱讀('r'),並使用csv.reader將其轉換爲行迭代器並查找所有名稱。您可以將這些名稱添加到集合中,然後在永久後檢查該集合。

重新#3:

爲了得到這一套,你可以定義一個函數像這樣:

def get_people(): 
    with open(..., 'r') as f: 
     return set(map(tuple, csv.reader(f))) 

然後,如果您分配了設置的地方,例如existing_people = get_people() 那麼你可以對證增加新的人物時,如下:

newrow = (name, phone, address, birthday) 
if newrow in existing_people: 
    return False 
else: 
    existing_people.add(newrow) 
    friendwriter.writerow(newrow) 
+0

重1.這就是它的作用。我一直在不斷向csv添加值。它只是將數字值添加到第一列。不知道如何爲字符串仍然做?感謝您對3的幫助! – Stephen

+0

@Stephen嘗試下面的代碼:'import csv;從StringIO導入StringIO; x = StringIO(); csv.writer(x,delimiter ='',quotechar ='|',quoting = csv.QUOTE_MINIMAL).writerow((「a」,「b」,2,3)); print x.getvalue()' - 它有四列還是一列?如果你說它有四個,那麼我沒有看到問題。如果您說它有一個,那麼您選擇了錯誤的列分隔符,因爲那是您選擇的列分隔符下的四列,但如果您選擇了不同的列分隔符,則只有一列。 –

0

你是不是說明你已經經歷如何使用Python的,所以我的目標這一點低 - 無犯罪意圖

  1. 你的家庭作業有幾個「要求」。一般來說,你應該確保一個函數完成一件事。因此,爲了滿足您的所有要求,您需要多種功能;看看如何創建至少一個模塊(即一個包含函數的文件)。

  2. 引號的空格分隔符和|是非常不尋常的。對於當前文件,列之間的分隔符是什麼?什麼是用來引用/轉義文本?(通過「轉義文本」,我的意思是:如果我有一個使用逗號作爲列分隔符的csv文件,並且我想用逗號將句子放入一列中,我需要說明逗號之間的區別,意思是「新列」和一個逗號是在一列一個句子的一部分。微軟決定的Excel將支持雙引號,所以"hello, sailor"成了事實上標準。

  3. 如果你想知道,如果"bob brown」已經在該文件,則需要試圖插入前先閱讀整個文件第一。爲此,可以使用'r',然後'w'做的。但是,如果你每一次閱讀整個文件要插入一條記錄?如果你有什麼胡要添加的100個記錄 - 你應該每次閱讀整個文件嗎?有沒有在添加過程中存儲名稱的方法?

  4. blah不是字符串。它需要被引用爲字符串文字("blah")。 blah只是指名稱爲blah的變量。如果它說沒有定義blah,那是因爲您尚未聲明變量blah來保存任何內容。

相關問題