通过Python向CSV文件添加数据

2024-06-10 00:39:36 发布

您现在位置: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

Tags: csv函数namefriendaddabaddressphone
3条回答

你并没有说明你对Python的经验,所以我的目标是稍微低一点-无意冒犯

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

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

  3. 如果您想知道"bob brown”是否已经在文件中,则需要先读取整个文件,然后再尝试插入。您可以使用'r',然后使用'w'。但你应该每次想插入一条记录时都阅读整个文件吗?如果你有100条记录要添加,你应该每次都读取整个文件吗?在添加过程中是否有存储名称的方法?

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

  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)

根据你的要求,以及你似乎想做的事情,我写了以下几点。它应该足够冗长,可以理解。

读取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")

相关问题 更多 >