2013-04-09 101 views
0

csv文件正常工作。 dictionary,但我似乎無法檢查csv文件中的值,以確保我不添加重複條目。我怎樣才能檢查這個?我試過的代碼如下:Python詞典和CSV值|檢查CSV

def write_csv(): 
     csvfile = csv.writer(open("address.csv", "a")) 
     check = csv.reader(open("address.csv")) 
     for item in address2: 
      csvfile.writerow([address2[items]['address']['value'],address2[items]['address']['count'],items, datetime.datetime.now()]) 


    def check_csv(): 
     check = csv.reader(open("address.csv")) 
     csvfile = csv.writer(open("address.csv", "a")) 
     for stuff in address2: 
      address = address2[str(stuff)]['address']['value'] 
      for sub in check: 
       if sub[0] == address: 
        print "equals" 
        try: 
         address2[stuff]['delete'] = True 
        except: 
         address2[stuff]['delete'] = True 
       else: 
        csvfile.writerow([address2[stuff]['address']['value'], address2[stuff]['address']['count'], stuff, datetime.datetime.now()]) 

任何想法?

+0

它以什麼方式不起作用?你有錯誤嗎?如果是這樣,有什麼錯誤? – BrenBarn 2013-04-09 03:45:50

+2

你究竟想要做什麼? check_csv中的address2是什麼?有幾件事情你想改變,但是當你澄清你的問題時我們會解決這個問題。 – 2013-04-09 03:47:15

+0

@Keeyai,我試圖確保'dictionary'' address2'中的新項目不在'csv'文件'address.csv'中。如果它已經在'csv'文件中,我想標記它被刪除(但不是真的刪除它),如果它不在'csv'中,則添加新行。它從上面引發'鍵錯誤',我無法弄清楚爲什麼(每個'key'項目單獨測試時,它工作正常) – jmitchel3 2013-04-09 05:50:42

回答

1

您的CSV和字典結構有點過分 - 我很想知道這是否已設置,或者您是否可以將它們更改爲更有用。這裏有一個基本上是你想要的東西的例子 - 你必須改變一些東西來適應你的格式。最重要的變化可能不會寫入您正在閱讀的文件 - 這會導致頭痛。

這就是你問的刪除標誌 - 是否有外部需求呢?如果沒有,幾乎肯定會有更好的方法(刪除壞行,將好行保存在別的地方等 - 取決於你在做什麼)。

無論如何,這裏是例子。我只使用註釋塊首先創建csv文件,然後將新地址添加到列表中並運行剩餘的部分。它不是循環遍歷文件,而是通過地址進行查找字典並存儲行號,然後在讀取csv文件時發現該行號,以更新刪除標誌。您需要將打印件取出並取消註釋最後一行以實際寫入新行。

import csv, datetime 

addresses = [ 
    {'address': {'value': '123 road', 'count': 1}, 'delete': False}, 
    {'address': {'value': '456 road', 'count': 1}, 'delete': False}, 
    {'address': {'value': '789 road', 'count': 1}, 'delete': False}, 

    {'address': {'value': '1 new road', 'count': 1}, 'delete': False}, 
] 

now = datetime.datetime.now() 

### create the csv 
##with open('address.csv', 'wb') as csv_file: 
## writer = csv.writer(csv_file) 
## for row in addresses: 
##  writer.writerow([ row['address']['value'], row['address']['count'], now.strftime('%Y-%m-%d %H:%M:%S') ]) 

# make lookup keys for the dict 
address_lookup = {} 
for i in range(len(addresses)): 
    address_row = addresses[i] 
    address_lookup[address_row['address']['value']] = i 

# read csv once 
with open('address.csv', 'rb') as csv_file: 
    reader = csv.reader(csv_file) 
    for row in reader: 
     print row 
     # if address is found in the dict, set delete flag to true 
     if row[0] in address_lookup: 
      print 'flagging address as old: %s' % row[0] 
      addresses[ address_lookup[row[0]] ]['delete'] = True 

with open('address.csv', 'ab') as csv_file: 
    # go back through addresses and add any that shouldnt be deleted to the csv 
    writer = csv.writer(csv_file) 
    for address_row in addresses: 
     if address_row['delete'] is False: 
      print 'adding row: ' 
      print address_row 
      #writer.writerow([ row['address']['value'], row['address']['count'], now.strftime('%Y-%m-%d %H:%M:%S') ]) 
+0

完美。在使用'django'和'mysql'之前進行內部測試肯定更多,因爲您可能知道有一個非常方便的功能,名爲get_or_create,具有諸如地址之類的對象。 – jmitchel3 2013-04-09 23:57:23