2013-04-09 100 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