2017-01-25 2 views
0

Я пытаюсь прочитать файл CSV и принимать заголовки как ключ, а тело - пары значений. Вот мой файл Python:Чтение CSV-данных в виде заголовков и пар значений

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() 

Но я получаю сообщение об ошибке Индекс:

File "./load_calllogs.py", line 16, in readCsv data[row[column]] = {key: value for key, value in zip(headers, row[1:])} IndexError: list index out of range

Вот мой 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 
+1

Просто используйте 'csv.DictReader' – tzaman

ответ

1

Попробуйте этот код.

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))) 

Вот вывод (список, содержащий dicts):

[{'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': '', 'caller': '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', 'assignedTo': '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'}]

+0

спасибо ..... на самом деле я пытаюсь изучить python. Итак, я думал не использовать какую-либо автоматизацию. Ваш ответ помог мне. –

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` поле используется в качестве ключа, который также оставил в самом словаре.

+0

На самом деле я пытался решить проблему без какой-либо автоматизации (DictReader) спасибо в любом случае ..... Спасибо в любом случае –

+0

Нет проблем. Просто чтобы предупредить вас, если вы используете подход 'split()', он не сработает, если у CSV произойдет дополнительное экранирование, например. поле примечания содержит запятую и к ней добавлены цитаты. Библиотека Python автоматически выполняет все это. –

Смежные вопросы