Como é que isso funciona?
-
13-09-2019 - |
Pergunta
Então, estou tentando compreender o arquivo de origem do CSV2Rec no matplotlib.mlab. É usado para pegar um arquivo CSV e analisar os dados em determinados formatos. Portanto, pode levar uma string '234' e convertê -la em int. Ou pegue uma string de data e transforme -a em Python DataTeates.
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
Meu problema com esta função é 'conversores'. Começa como nenhum. Mais tarde, 'Func = conversores [J]' J Eu sei que é um número que é criado apenas através da enumeração. Portanto, está procurando o item de conversores correspondentes, conforme indexado por j. Mas não há nada em conversores porque não está certo? A menos que os programas Python não precisem ser lidos de cima para baixo? Nesse caso, obtemos o Func das próximas duas linhas "se Len (item.st .... etc)" ou da seção 'else:'. Mas eu apenas assumi que teria que ser lido de cima para baixo.
Não sei se alguma das outras coisas é importante, então apenas incluí toda a função. O Converterd é um mapeamento de dicionário, acredito que o usuário pode fornecer como parâmetro para encontrar um conversor automaticamente. O CheckRows é apenas um número fornecido pelo usuário como um parâmetro no começo para verificar a validade. Por padrão, não é nenhum. Eu ainda sou meio iniciante, então apenas FYI. =)
Obrigado a todos. Este site é tão útil!
Solução
Os conversores são definidos novamente no início do loop com
if i==0:
converters = [mybool]*len(row)
Então, depois disso, não é mais nenhum.
Outras dicas
A menos que esteja perdendo alguma coisa, na primeira iteração "i" é 0, então o seguinte é executado:
converters = [mybool]*len(row)
E isso inicializa "conversores"
Primeiro,
converters = None
define um valor inicial para converters
. Dessa forma, se a iteração não acontecer (porque readers
pode estar vazio) então quando a função retornar converters
ele existirá e terá o valor None
.
Se a iteração sobre readers
acontece então converters
é imediatamente redefinido para um valor mais significativo na primeira passagem pela iteração (quando i==0
):
converters = [mybool]*len(row)