【问题标题】:Reading CSV data as headers and value pairs读取 CSV 数据作为标题和值对
【发布时间】:2017-01-25 10:26:52
【问题描述】:

我正在尝试读取 CSV 文件并将标题作为键,将正文作为值对。 这是我的 Python 文件:

from pymongo import MongoClient
import requests

import csv
import sys
data = {}

def readCsv(csvFile, column):
    with open(csvFile, "rb") as infile:
        reader = csv.reader(infile)
        headers = next(reader)[1:]
        for row in reader:
            data[row[column]] = {key: value for key, value in zip(headers, row[1:])}

def readCalllogs():
    for loanNumber in data:
        logDetail = data[loanNumber]
        print logDetail
        resp = requests.post('http://localhost:3500/api/v1/call_logs', json=logDetail)
        if resp.status_code != 201:
                print resp.status_code
        else:
            print logDetail

def writeYAMLFile():
    for loan in loans:
        print loan["assignedTo"]


def loadCalllogsFromCsv():
    readCsv("calllogs.csv", 0)
    readCalllogs()

def main():
    loadCalllogsFromCsv()


if __name__ == "__main__":
    main()

但我收到一个索引错误:

文件“./load_calllogs.py”,第 16 行,在 readCsv 中 数据[行[列]] = {键:键的值,zip中的值(标题,行[1:])} IndexError: 列表索引超出范围

这是我的 CSV 文件:

loanNumber,date,contactStatus,contactRelation,contactName,response,tenantId,actionDate,action,assignedTo,remarks,caller
1,,CONNECTED,SELF,NAME1,RESPONSE1,,,FIELD_PTP,ASSIGN1,REMARK1,CALLER1
2,,WRONG_NUMBER,SELF,NAME2,RESPONSE2,,,MEET_GUARANTOR,ASSIGN2,REMARK2,CALLER2
3,,CONNECTED,WIFE,NAME3,RESPONSE3,,,FIELD_PTP,ASSIGN3,REMARK3,CALLER3
4,,NO_RESPONSE,HUSBAND,NAME4,RESPONSE4,,,MEET_GUARANTOR,ASSIGN4,REMARK4,CALLER4
5,,CONNECTED,SON,NAME5,RESPONSE5,,,VISIT_CUSTOMER,ASSIGN5,REMARK5,CALLER5
6,,CONNECTED,SON,NAME6,RESPONSE6,,,VISIT_CUSTOMER,ASSIGN6,REMARK6,CALLER6

【问题讨论】:

  • 只要使用csv.DictReader

标签: python csv


【解决方案1】:

DictReader 会帮助您。它会自动读取标题,然后根据该行将后面的每一行转换为字典。然后通过它们的名称而不是它们的位置来访问列:

import csv

data = {}

def readCsv(csvFile, column):
    with open(csvFile, "rb") as infile:
        reader = csv.DictReader(infile)

        for row in reader:
            data[row[column]] = row

readCsv("calllogs.csv", 'loanNumber')
print data

这会给你:

{'1': {'actionDate': '', 'loanNumber': '1', 'assignedTo': 'ASSIGN1', 'caller': 'CALLER1', 'tenantId': '', 'action': 'FIELD_PTP', 'remarks': 'REMARK1', 'contactName': 'NAME1', 'contactRelation': 'SELF', 'date': '', 'response': 'RESPONSE1', 'contactStatus': 'CONNECTED'}, '3': {'actionDate': '', 'loanNumber': '3', 'assignedTo': 'ASSIGN3', 'caller': 'CALLER3', 'tenantId': '', 'action': 'FIELD_PTP', 'remarks': 'REMARK3', 'contactName': 'NAME3', 'contactRelation': 'WIFE', 'date': '', 'response': 'RESPONSE3', 'contactStatus': 'CONNECTED'}, '2': {'actionDate': '', 'loanNumber': '2', 'assignedTo': 'ASSIGN2', 'caller': 'CALLER2', 'tenantId': '', 'action': 'MEET_GUARANTOR', 'remarks': 'REMARK2', 'contactName': 'NAME2', 'contactRelation': 'SELF', 'date': '', 'response': 'RESPONSE2', 'contactStatus': 'WRONG_NUMBER'}, '5': {'actionDate': '', 'loanNumber': '5', 'assignedTo': 'ASSIGN5', 'caller': 'CALLER5', 'tenantId': '', 'action': 'VISIT_CUSTOMER', 'remarks': 'REMARK5', 'contactName': 'NAME5', 'contactRelation': 'SON', 'date': '', 'response': 'RESPONSE5', 'contactStatus': 'CONNECTED'}, '4': {'actionDate': '', 'loanNumber': '4', 'assignedTo': 'ASSIGN4', 'caller': 'CALLER4', 'tenantId': '', 'action': 'MEET_GUARANTOR', 'remarks': 'REMARK4', 'contactName': 'NAME4', 'contactRelation': 'HUSBAND', 'date': '', 'response': 'RESPONSE4', 'contactStatus': 'NO_RESPONSE'}, '6': {'actionDate': '', 'loanNumber': '6', 'assignedTo': 'ASSIGN6', 'caller': 'CALLER6', 'tenantId': '', 'action': 'VISIT_CUSTOMER', 'remarks': 'REMARK6', 'contactName': 'NAME6', 'contactRelation': 'SON', 'date': '', 'response': 'RESPONSE6', 'contactStatus': 'CONNECTED'}}

您会注意到loadNumber 字段用作键,它也留在字典本身中。

【讨论】:

  • 实际上我试图在没有任何自动化的情况下解决问题(DictReader)无论如何谢谢.....谢谢
  • 没问题。只是警告您,如果您使用 split() 方法,如果 CSV 碰巧有任何额外的转义,它将失败,例如备注字段包含逗号,并已添加引号。 Python 库会自动处理所有这些。
【解决方案2】:

试试这个代码。

file = "your_file.csv"

my_list = []

with open(file, mode='r') as input_file:
    rows = []
    for row in input_file:
        rows.append(row.rstrip('\n').split(","))
    keys = rows[0]
    for values in rows[1:]:
        my_list.append(dict(zip(keys, values)))

这是输出(包含字典的列表):

[{'actionDate': '', 'caller': 'CALLER1', 'contactStatus': 'CONNECTED', 'contactName': 'NAME1', 'tenantId': '', 'loanNumber': '1' , 'action': 'FIELD_PTP', 'contactRelation': 'SELF', 'assignedTo': 'ASSIGN1', 'remarks': 'REMARK1', 'date': '', 'response': 'RESPONSE1'}, { 'actionDate':'','caller':'CALLER2','contactStatus':'WRONG_NUMBER','contactName':'NAME2','tenantId':'','loanNumber':'2','action': 'MEET_GUARANTOR', 'contactRelation': 'SELF', 'assignedTo': 'ASSIGN2', 'remarks': 'REMARK2', 'date': '', 'response': 'RESPONSE2'}, {'actionDate': ' ','呼叫者':'CALLER3','contactStatus':'CONNECTED','contactName':'NAME3','tenantId':'','loanNumber':'3','action':'FIELD_PTP',' contactRelation': 'WIFE', 'assignedTo': 'ASSIGN3', 'remarks': 'REMARK3', 'date': '', 'response': 'RESPONSE3'}, {'actionDate': '', 'caller' :'CALLER4','contactStatus':'NO_RESPONSE','contactName':'NAME4','tenantId':'','loanNumber':'4','action':'MEET_GUARANTOR','contactRelation':'HUSBAND ', '分配edTo': 'ASSIGN4', 'remarks': 'REMARK4', 'date': '', 'response': 'RESPONSE4'}, {'actionDate': '', 'caller': 'CALLER5', 'contactStatus' :'CONNECTED','contactName':'NAME5','tenantId':'','loanNumber':'5','action':'VISIT_CUSTOMER','contactRelation':'SON','assignedTo':'ASSIGN5 ', 'remarks': 'REMARK5', 'date': '', 'response': 'RESPONSE5'}, {'actionDate': '', 'caller': 'CALLER6', 'contactStatus': 'CONNECTED', 'contactName':'NAME6','tenantId':'','loanNumber':'6','action':'VISIT_CUSTOMER','contactRelation':'SON','assignedTo':'ASSIGN6','remarks' : 'REMARK6', 'date': '', 'response': 'RESPONSE6'}]

【讨论】:

  • 谢谢.....实际上我正在尝试学习python。所以,我想不使用任何自动化。你的回答对我有帮助。
猜你喜欢
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多