Как это работает?
-
13-09-2019 - |
Вопрос
Итак, я пытаюсь понять исходный файл для csv2rec в matplotlib.mlab.Он используется для получения csv-файла и преобразования данных в определенные форматы.Таким образом, он может взять строку '234' и преобразовать ее в int.или возьмите строку даты и преобразуйте ее в python datetimes.
def get_converters(reader):
converters = None
for i, row in enumerate(reader):
if i==0:
converters = [mybool]*len(row)
if checkrows and i>checkrows:
break
#print i, len(names), len(row)
#print 'converters', zip(converters, row)
for j, (name, item) in enumerate(zip(names, row)):
func = converterd.get(j)
if func is None:
func = converterd.get(name)
if func is None:
#if not item.strip(): continue
func = converters[j]
if len(item.strip()):
func = get_func(name, item, func)
else:
# how should we handle custom converters and defaults?
func = with_default_value(func, None)
converters[j] = func
return converters
Моя проблема с этой функцией - "конвертеры". Она начинается как None.Затем позже 'func = converters[j]' j, я знаю, это число, которое только что создано с помощью перечисления.Таким образом, он ищет соответствующий элемент converters, проиндексированный по j.Но в конвертерах ничего нет, потому что это неправильно?Разве программы на Python не обязательно читать сверху вниз?В этом случае мы получаем функцию из следующих двух строк "if len(item.st....etc)" или из раздела "else:".Но я просто предположил, что это нужно будет читать сверху вниз.
Я не знаю, важны ли какие-либо другие вещи, поэтому я просто включил всю функцию целиком.converterd - это сопоставление по словарю, которое, я полагаю, пользователь может предоставить в качестве параметра для автоматического поиска конвертера.checkrows - это просто число, предоставленное пользователем в качестве параметра в начале для проверки достоверности.По умолчанию это значение равно None.Я все еще в некотором роде новичок, так что просто к твоему сведению.=)
Спасибо всем.Этот сайт такой полезный!
Решение
Converters снова настраивается в начале цикла с помощью
if i==0:
converters = [mybool]*len(row)
Так что после этого это уже не Ничто.
Другие советы
Если я чего-то не упускаю, на первой итерации "i" равно 0, поэтому выполняется следующее:
converters = [mybool]*len(row)
и это инициализирует "конвертеры".
Первый,
converters = None
задает начальное значение для converters
.Таким образом, если итерация не выполняется (потому что readers
может быть пустым), затем, когда функция возвращает converters
он будет существовать и иметь соответствующую ценность None
.
Если итерация завершится readers
случается, значит converters
немедленно сбрасывается на более значимое значение при первом прохождении итерации (когда i==0
):
converters = [mybool]*len(row)