通过Python将数据添加到CSV文件

时间:2011-08-31 13:40:18

标签: python csv

我有一个将新数据添加到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,而不是添加它。但是,我不知道如何做到这一点。有什么想法吗?
  4. 这是我的代码:

    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
    

3 个答案:

答案 0 :(得分: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)

  1. 不这样做。是什么让你觉得它的作用是什么?您真正想要的引用方案可能不是您为csv.writer指定的引用方案:即,空格分隔列,|是引用字符。
  2. blah不是字符串文字,"blah"是。不带引号的blah是变量引用,此变量不存在。
  3. 要检查名称是否已存在于CSV文件中,您必须先读取整个CSV文件,然后检查详细信息。打开文件两次:首先读取('r'),然后使用csv.reader将其转换为行迭代器并查找所有名称。您可以将这些名称添加到集合中,然后在此之后永远检查该集合。
  4. 重新#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)
    

答案 2 :(得分:0)

你并没有说明你已经拥有Python的经验,所以我瞄准的目标有点低 - 没有冒犯的意图

  1. 您的作业有几个“要求”。一般来说,你应该确保一个函数做一件事。因此,为了满足您的所有要求,您需要多种功能;看看创建至少一个模块(即包含其中功能的文件)。

  2. 空格分隔符和引号的|非常不寻常。对于当前文件,列之间的分隔符是什么?什么用于引用/转义文本? (通过“转义文本”,我的意思是:如果我有一个使用逗号作为列分隔符的csv文件,并且我想将一个带逗号的句子放入一列,我需要告诉逗号之间的区别“新列“和逗号是列中一个句子的一部分。微软决定Excel支持双引号 - 所以"hello, sailor"成为事实上的标准。

  3. 如果您想知道文件中是否已有"bob brown”,您需要在尝试插入之前先读取整个文件。您可以使用'r',然后'w'执行此操作。但是,每次要插入一条记录时,是否应该读取整个文件?如果你要添加一百条记录怎么办 - 你应该每次都阅读整个文件吗?有没有办法在添加过程中存储名称?

  4. blah不是字符串。它需要被引用为字符串文字("blah")。 blah只是引用名称为blah的变量。如果没有定义blah,那是因为您没有声明变量blah来保存任何内容。