将csv读入字典,第一行成为名称

时间:2014-05-19 19:01:26

标签: python csv dictionary

在python中

我有一个csv文件,里面有很多参数,如:

Name, Surname, Address1, Address2, email, etc
Adam1,Smith1,12 Connaugh Rd.,,adamsmith@gmail.com, etc...
Adam2,Smith2,12 Connaugh Rd.,,adamsmith@gmail.com, etc...
Adam3,Smith3,12 Connaugh Rd.,,adamsmith@gmail.com, etc...

我如何阅读,所以第一行名称,姓氏,地址1,地址2,电子邮件等 成为字典中参数的名称?所以我可以得到

Dict{Name:Adam1,Adam2, Adam3
     Surname: Smith1,Smith2,Smith3
     Address1: 12 Connaugh Rd.,12 Connaugh Rd.,12 Connaugh Rd.
        etc.}

由于我将来会使用它,这是使用csv的最好方法还是有更好的方法?

UPDATE1: ripr(行) 给出:

{None: ['\tSales Record Number', 'User Id', 'Buyer Full name', 'Buyer Phone Number', 'Buyer Email', 'Buyer Address 1', 'Buyer Address 2', 'Buyer Town/City', 'Buyer County', 'Buyer Postcode', 'Buyer Country', 'Item Number', 'Item Title', 'Custom Label', 'Quantity', 'Sale Price', 'Included VAT Rate', 'Postage and Packaging', 'Insurance', 'Cash on delivery fee', 'Total Price', 'Payment Method', 'Sale Date', 'Checkout Date', 'Paid on Date', 'Dispatch Date ', 'Invoice date', 'Invoice number', 'Feedback left', 'Feedback received', 'Notes to yourself', 'PayPal Transaction ID', 'Delivery Service', 'Cash on delivery option', 'Transaction ID', 'Order ID', 'Variation Details']}
{None: ['3528', 'steve33559', 'Steven sdf', '45678', 'sdfghj@dfgj.com', '1 sdfgh Road, ', '', 'dfgh', 'dfgh', 'ertyu', 'United Kingdom', '151216259484', 'Small stuff ', '', '1', '\xa311.99', '', '\xa30.00', '\xa30.00', '', '\xa311.99', 'PayPal', '21-Mar-14', '21-Mar-14', '21-Mar-14', '', '', '', 'Yes', '', '', '384858394n5838f48', 'Other 24 Hour Courier', '', '49503847573848', '', '']}
{None: ['3529', 'buyretry13', 'Tariq fhb', '345678', 'buyretry@uk.com', '80 rtyukfd Road', '', 'Manchester', 'wertyuk', 'M16 1KY', 'United Kingdom', '76543283858', 'Apple iPhone 5', '100329', '1', '\xa31.95', '', '\xa30.00', '\xa30.00', '', '\xa31.95', 'PayPal', '21-Mar-14', '21-Mar-14', '21-Mar-14', '', '', '', 'Yes', '', '', '45678723456', 'Royal Mail 2nd Class', '', '3456785737', '', '']}

1 个答案:

答案 0 :(得分:2)

您可以使用zip()将列转置为行,并将其应用于字典理解以提取第一个元素作为键:

import csv

with open(yourfile, 'rb') as infile:
    reader = csv.reader(infile)
    result = {c[0]: c[1:] for c in zip(*reader)}

这会生成一个字典,每个字典都将列中的所有条目作为值列表。

但是,您最好在此使用csv.DictReader()。这会产生一个dict对象每行

import csv

with open(yourfile, 'rb') as infile:
    reader = csv.DictReader(infile)
    for row in reader:
        print row

其中row为第一行{'Name': 'Adam1', 'Surname': 'Smith1', 'Address1': 'Connaugh rd.', ...}{'Name': 'Adam2', 'Surname': 'Smith2', 'Address1': 'Connaugh rd.', ...}等。DictReader()对象从CSV数据的第一行获取密钥。

这会将每行数据保存为一个易于访问的对象,而不必在不同行之间关联数据。

演示:

>>> import csv
>>> sample = '''\
... Name,Surname,Address1,Address2,email,etc
... Adam1,Smith1,12 Connaugh Rd.,,adamsmith@gmail.com,etc...
... Adam2,Smith2,12 Connaugh Rd.,,adamsmith@gmail.com,etc...
... Adam3,Smith3,12 Connaugh Rd.,,adamsmith@gmail.com,etc...
... '''
>>> reader = csv.DictReader(sample.splitlines())
>>> print next(reader)
{'Surname': 'Smith1', 'Name': 'Adam1', 'Address1': '12 Connaugh Rd.', 'Address2': '', 'etc': 'etc...', 'email': 'adamsmith@gmail.com'}
>>> print next(reader)
{'Surname': 'Smith2', 'Name': 'Adam2', 'Address1': '12 Connaugh Rd.', 'Address2': '', 'etc': 'etc...', 'email': 'adamsmith@gmail.com'}
>>> print next(reader)
{'Surname': 'Smith3', 'Name': 'Adam3', 'Address1': '12 Connaugh Rd.', 'Address2': '', 'etc': 'etc...', 'email': 'adamsmith@gmail.com'}