我疯狂地搜索,试图找到具体如何读取 csv 文件中的行。
我需要从 1000 行中随机读取一行,每行有 3 列。第一列有一封电子邮件。我需要放入一封随机电子邮件,然后取出第 2 列和第 3 列。 (Python 2.7,csv 文件)
例子:
Name Date Color
Ray May Gray
Alex Apr Green
Ann Jun Blue
Kev Mar Gold
Rob May Black
我需要的不是第 1 列第 3 行,而是 [Ann],她的整行。这是一个 CSV 文件,包含 1000 多个名称。我必须输入她的名字并输出她的整行。
我尝试过的
from collections import namedtuple
Entry = namedtuple('Entry', 'Name, Date, Color')
file_location = "C:/Users/abriman/Desktop/Book.csv"
ss_dict = {}
spreadsheet = file_location = "C:/Users/abriman/Desktop/Book.csv"
for row in spreadsheet:
entry = Entry(*tuple(row))
ss_dict['Ann']
我的错误是
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: __new__() takes exactly 4 arguments (2 given)
我也尝试过其他方法,但收效甚微。我是 Python 的初学者。
请您参考如下方法:
您走在正确的轨道上。第一个问题:您永远不会打开位于file_location 的文件。因此,当您迭代 for row in spreadsheet: 时,您正在迭代 spreadsheet 的字符,它们是 file_location 的字符,是 "C:/Users/..." 的字符。因此,您要做的第一件事实际上是打开文件:
spreadsheet = open(file_location, 'r')
您的循环中还有另一个问题。当您在 for 循环中遍历文件时,您会取回文件的行。因此,在每次迭代中,row 将是一行,例如“雷·梅·格雷”。当你调用 tuple() 时,你会得到一个看起来像 ('R', 'a', 'y', ' ', ' ', ' M', ...)。您需要做的是通过拆分空格来构建您的元组:
entry = Entry(*row.split())
然后,您需要添加您的词条到字典ss_dict:
ss_dict[entry.Name] = entry
最后,您可以读出 ss_dict['Ann'] 的值,但这应该在您的循环之外 - 如果您在循环内这样做,您可能会尝试读取该值ss_dict['Ann'] 在它被设置之前。总而言之,您的代码应如下所示:
from collections import namedtuple
Entry = namedtuple('Entry', 'Name, Date, Color')
file_location = "C:/Users/abriman/Desktop/Book.csv"
ss_dict = {}
spreadsheet = open(file_location, 'r') # <--
for row in spreadsheet:
entry = Entry(*row.split()) # <--
ss_dict[entry.Name] = entry # <--
print ss_dict['Ann']
顺便说一句,您收到错误消息的原因是,当您执行 for row in spreadsheet: 时 spreadsheet 是一个字符串,row 只是一个字符,正如我提到的,所以 tuple(row) 只是一个包含一个字符的元组,因此长度为 1,所以你当您执行 *tuple(row) 时,只传递一个参数而不是三个参数。
综上所述,您可能需要考虑查看 the csv module ,它是标准库的一部分,专为读取 csv 文件而设计。从长远来看,它可能会让您的生活更轻松。
