Добавление dict к списку внутри цикла for - PullRequest
0 голосов
/ 11 июня 2018

Согласно моему отладчику и моему тесту csv из 25 строк, список patient_appts содержит 25 сообщений, как и ожидалось.Я не могу понять, как этот список становится None между локальной переменной, оператором возврата и главной функцией.

В нескольких местах я читал, что вам нужно сделатьскопируйте вместо добавления ссылки, которую я сделал, насколько я знаю, используя patient_appts.append(entry.copy())

Извините, если код вроде крушения, я довольно новичок в этом ипытаясь автоматизировать какую-то работу - например, я почти уверен, что не должен вручную создавать форматирование json для своих данных, но это выходит за рамки этого вопроса.

Я пытался создать экземпляр списка в глобальном масштабе.а не внутри функции, глобально и объявлено глобально внутри функции, создание экземпляра списка сразу после with ed as ed_file:;похоже, что все они дают одинаковый результат (print(len(appointments))):

Произошло исключение.TypeError, объект типа 'NoneType' не имеет len ()

Отладчик четко показывает диктанты в списке перед тем, как перейти к return:

debugger picture

import csv
from datetime import datetime, timedelta
from validate_email import validate_email
from fieldMap import fieldMap

record_count = 0
valid_email_count = 0



def run_CSV(ed):
    with ed as ed_file:
        global record_count
        global valid_email_count
        patient_appts = []
        header_row = True
        ed_reader = csv.reader(ed_file, delimiter=',', quotechar='"')

        for row in ed_reader:
            if not row[0] and not row[1]:
                print('\n%i records written to csv' % record_count
                      + '\n%i valid emails found' % valid_email_count)
                return
            elif header_row:
                headers = list(row)
                i_fname = headers.index(fieldMap['FirstName'])
                i_mname = headers.index(fieldMap['MiddleName'])
                i_lname = headers.index(fieldMap['LastName'])
                i_email = headers.index(fieldMap['Email'])
                i_start = headers.index(fieldMap['StartTime'])
                i_end = headers.index(fieldMap['EndTime'])
                i_location = headers.index(fieldMap['Location'])
                i_type = headers.index(fieldMap['Type'])
                i_appt_id = headers.index(fieldMap['ApptID'])
                header_row = False
            else:
                duration = getDuration(row[i_start], row[i_end])
                start_time = row[i_start]
                end_time = row[i_end]
                valid_email = validate_email(row[i_email])

                if valid_email:
                    valid_email_count += 1
                record_count += 1

                entry = {
                    'ApptID': row[i_appt_id],
                    'Data': {
                        'Patient': {
                            'FirstName': row[i_fname],
                            'MiddleName': row[i_mname],
                            'LastName': row[i_lname],
                            'Email': row[i_email],
                            'Valid Email': valid_email,
                            'Appointment': {
                                'Type': row[i_type],
                                'Location': row[i_location],
                                'StartTime': start_time,
                                'EndTime': end_time,
                                'Duration': duration
                            }
                        }
                    }
                }
                patient_appts.append(entry.copy())
        return patient_appts

def getDuration(start_time, end_time):
    fmt = '%I:%M %p'
    tdelta = datetime.strptime(
        end_time, fmt) - datetime.strptime(start_time, fmt)
    duration = str(tdelta).split(':')[1]
    return duration


def main():
    appointments = run_CSV(open(input('Enter full CSV Path:\n'), newline='\n'))
    print(len(appointments))

if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 11 июня 2018

У вас есть случайный оператор return в функции run_CSV, и когда вы нажимаете, ваши функции ничего не возвращают - None

Когда ваша main функция пытается выполнить len вчто None вы получите эту ошибку.Поскольку это часть цикла, я предполагаю, что вы хотели использовать break там, а не return

Это должно выглядеть так:

    for row in ed_reader:
        if not row[0] and not row[1]:
            print('\n%i records written to csv' % record_count
                  + '\n%i valid emails found' % valid_email_count)
            break # formerly "return" was here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...