我有一个将新数据添加到csv文件的函数。我有点工作了。但是,我遇到了一些问题。
(name, phone, address, birthday)
时,它会将它们全部添加到一列中,而不是在同一行中分隔列。 (关于如何在各个栏目中拆分它们并不太了解......)add_friend(blah, 31, 12, 45)
,它会回来说blah
未定义。但是,如果我写add_friend(3,4,5,6)
,它会将其添加到新行 - 但是,添加到单个列中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
答案 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)
|
是引用字符。blah
不是字符串文字,"blah"
是。不带引号的blah
是变量引用,此变量不存在。'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)
答案 2 :(得分:0)
你并没有说明你已经拥有Python的经验,所以我瞄准的目标有点低 - 没有冒犯的意图
您的作业有几个“要求”。一般来说,你应该确保一个函数做一件事。因此,为了满足您的所有要求,您需要多种功能;看看创建至少一个模块(即包含其中功能的文件)。
空格分隔符和引号的|
非常不寻常。对于当前文件,列之间的分隔符是什么?什么用于引用/转义文本? (通过“转义文本”,我的意思是:如果我有一个使用逗号作为列分隔符的csv文件,并且我想将一个带逗号的句子放入一列,我需要告诉逗号之间的区别“新列“和逗号是列中一个句子的一部分。微软决定Excel支持双引号 - 所以"hello, sailor"
成为事实上的标准。
如果您想知道文件中是否已有"bob brown”
,您需要在尝试插入之前先读取整个文件。您可以使用'r'
,然后'w'
执行此操作。但是,每次要插入一条记录时,是否应该读取整个文件?如果你要添加一百条记录怎么办 - 你应该每次都阅读整个文件吗?有没有办法在添加过程中存储名称?
blah
不是字符串。它需要被引用为字符串文字("blah"
)。 blah
只是引用名称为blah
的变量。如果没有定义blah
,那是因为您没有声明变量blah
来保存任何内容。