fabioserpa / CNPJ-full

Utilitário em Python para ler os dados públicos do CNPJ disponibilizados pela Receita Federal e carregá-los em arquivos csv ou sqlite para fácil consumo. Também permite consultas com visualização interativa ou exportação para formatos diversos.
GNU General Public License v3.0
485 stars 190 forks source link

Erro separar csv por uf #42

Closed elossio closed 3 years ago

elossio commented 4 years ago

Boa tarde,

estou com o seguinte erro ao tentar separar o arquivo empresas.csv por uf.

E:\CNPJ-full-master\extra_csv>py separar_csv_por_uf.py Traceback (most recent call last): File "separar_csv_por_uf.py", line 9, in with codecs.open(location + file, 'r+', 'utf-8') as empresas: TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

O arquivo env.example está assim: FILES_LOCATION=\E:\TEMP

elossio commented 4 years ago

Solução:

settings.py

from dotenv import load_dotenv load_dotenv(verbose=True)

zfabiojunior commented 4 years ago

Boa Noite! Mesmo seguindo os passos acima, não consigo gerar os arquivos por CIDADE e/ou UF. Como deve ser o nome do arquivo .env? No Location uso \ ou /? Agradeço se puder ajudar.

elossio commented 4 years ago

Bom dia, Na ocasião o arquivo env.example e os script Python estavam no Windows, por isso o uso do back slash. Tente reproduzir aqui as linhas de comandos, o erro e o seu ambiente operacional para que possamos lhe auxiliar melhor. Você chegou a instalar o python-dotenv conforme descrito como pré-requisito? Onde está localizado o arquivo empresas.csv no seu ambiente operacional?

zfabiojunior commented 4 years ago

Opa, Bom Dia! Valeu pelas dicas amigo, segue: S.O - Windows 10 64bits Python: 3.8.6 Arquivo .env.example - FILES_LOCATION=\C:\RECEITA FEDERAL\BD Até criei um arquivo empresas.env com o mesmo conteúdo que o acima Comando CMD - C:\RECEITA FEDERAL\CNPJ-full-master\extra_csv>python separar_csv_por_uf.py Retorno - Traceback (most recent call last): File "separar_csv_por_uf.py", line 9, in with codecs.open(location + file, 'r+', 'utf-8') as empresas: TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

Dá o mesmo retorno com ou sem a alteração em setings.py

Agradeço muito a ajuda,

elossio commented 4 years ago

Você chegou a instalar o python-dotenv conforme descrito como pré-requisito? O arquivo empresas.csv está na localização indicada pelo arquivo env.example?

zfabiojunior commented 4 years ago

Fiz sim a instalação e acabei de refazer... C:\RECEITA FEDERAL\CNPJ-full-master\extra_csv>python -m pip install python-dotenv Requirement already satisfied: python-dotenv in c:\program files\python38\lib\site-packages (0.14.0) O arquivo está no caminho indicado... C:\RECEITA FEDERAL\BD>dir O volume na unidade C não tem nome. O Número de Série do Volume é 6892-843E

Pasta de C:\RECEITA FEDERAL\BD

23/10/2020 22:37

. 23/10/2020 22:37 .. 24/10/2020 01:14 1.764.224.982 cnaes_secundarios.csv 24/10/2020 01:14 13.782.485.660 empresas.csv 24/10/2020 01:14 2.773.791.495 socios.csv 3 arquivo(s) 18.320.502.137 bytes 2 pasta(s) 420.563.709.952 bytes disponíveis

Não faço ideia do que pode ser, já alterei o caminho de várias formas e nada....

elossio commented 4 years ago

Faz um teste. Repete o seu comando com a inclusão da instrução print(location) na linha 8 do script separa_csv_por_uf.py e veja o resultado na tela! Quero conferir a concatenação do location com a variável file

zfabiojunior commented 4 years ago

Não encontrou o caminho... C:\RECEITA FEDERAL\CNPJ-full-master\extra_csv>python separar_csv_por_uf.py None Traceback (most recent call last): File "separar_csv_por_uf.py", line 9, in with codecs.open(location + file, 'r+', 'utf-8') as empresas: TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

zfabiojunior commented 4 years ago

Já utilizei o Location das segintes formas nos arquivos: .env.exemple e empresas.env FILES_LOCATION=/RECEITA FEDERAL/BD FILES_LOCATION=c:\RECEITA FEDERAL\BD FILES_LOCATION=\c:\RECEITA FEDERAL\BD

rictom commented 4 years ago

Já utilizei o Location das segintes formas nos arquivos: .env.exemple e empresas.env FILES_LOCATION=/RECEITA FEDERAL/BD FILES_LOCATION=c:\RECEITA FEDERAL\BD FILES_LOCATION=\c:\RECEITA FEDERAL\BD

Será que vc não precisa colocar entre aspas, já que tem um espaço no meio de RECEITA FEDERAL, algo como FILES_LOCATION="c:/RECEITA FEDERAL/BD/" ou r"c:/RECEITA FEDERAL/BD/"

Pelo erro, TypeError: unsupported operand type(s) for +: 'NoneType' and 'str', parece que está tentando juntar o location + file, o location é lido na linha 5: location = os.getenv('FILES_LOCATION') A mensagem de erro está dizendo que a função os.getenv não está lendo o 'FILES_LOCATION'. Vc pode alterar a linha 5 do separar_csv_por_uf.py e colocar location = r"c:/RECEITA FEDERAL/BD/" precisa do / no final porque vai juntar a pasta com o nome do arquivo.

RF-Junior commented 3 years ago

Prezados boa Noite Desculpe a pergunta boba, sou novato no assunto. Estou usando Ubuntu e aparentemente meu .setting esta configurada e todos os pré requisitos foram atendidos. Mas ao rodar python separar_csv_por_uf.py

O erro de retorno é sempre:

File "separar_csv_por_uf.py", line 35 print('Erros de processamento: {}'.format(count_erro), end='\r') ^ SyntaxError: invalid syntax

Ele simplesmente ignora todo o início do arquivo e vai direto para a penúltima linha do código.

import settings import csv, codecs, os from header_dict import get_header_index

location = os.getenv('FILES_LOCATION')

file = 'empresas.csv'

with codecs.open(location + file, 'r+', 'utf-8') as empresas:

empresas = csv.reader(x.replace('\0', '') for x in empresas)

next(empresas,None)

count_sucesso = 0
count_erro = 0

if not os.path.exists(location + 'UFs/'):
    os.makedirs(location + 'UFs/')

for empresa in empresas:

    uf = empresa[get_header_index('uf')]

    try:
        uf_file = open(location + 'UFs/' + uf + ".csv", "a+")
    except:
        uf_file = open(location + 'UFs/' + uf + ".csv", "w+")

    try:
        uf_file.writelines('"' + '","'.join(empresa) + '"\n')
        count_sucesso += 1
    except:
        count_erro += 1

Linha 35 ->>> print('Erros de processamento: {}'.format(count_erro), end='\r')

    print('Empresas processadas: {}'.format(count_sucesso), end='\r')

Vcs poderiam me ajudar?

rictom commented 3 years ago

Esse script está lendo o conteúdo de empresas.csv. Você já criou esse arquivo? O comando é python3 cnpj.py PASTA_COM_ZIPS csv PASTA_DE_SAIDA --dir

RF-Junior commented 3 years ago

Obrigado pelo retorno. E Feliz Ano Novo!!! Que tenhamos muita saúde e paz em 2021.

Criei sim. Demorou cerca de 4 horas para gerar.

rictom commented 3 years ago

Como uso o windows, tem uma parte do código que não consigo usar, mas se eu comento a linha 1

import settings

e troco a linha do location para '' location = '' #os.getenv('FILES_LOCATION') e copia o arquivo empresas.csv para a pasta onde está o script separar_csv_poruf.py, funcionou normalmente.

RF-Junior commented 3 years ago

Sá o mesmo erro de antes.

root@ubuntu:/home/rjunior/CNPJ_Full/C/extra_csv# python separar_csv_por_uf.py File "separar_csv_por_uf.py", line 36 print('Erros de processamento: {}'.format(count_erro), end='\r') ^ SyntaxError: invalid syntax

elossio commented 3 years ago

Obrigado pelo retorno. E Feliz Ano Novo!!! Que tenhamos muita saúde e paz em 2021.

Criei sim. Demorou cerca de 4 horas para gerar.

Boa tarde @RF-Junior, você fez opção pela geração dos arquivos csv. Você poderia reproduzir a sintaxe do comando utilizado? Foi alguma coisa assim python3 cnpj.py "PASTA_COM_ZIPS" csv "PASTA_DE_SAIDA" --dir

Os três arquivos empresa.csv, cnaes_secundarios.csv e socios.csv estão numa pasta diferente do local do script separar_csv_por_uf.py?

elossio commented 3 years ago

Prezados boa Noite Desculpe a pergunta boba, sou novato no assunto. Estou usando Ubuntu e aparentemente meu .setting esta configurada e todos os pré requisitos foram atendidos. Mas ao rodar python separar_csv_por_uf.py

O erro de retorno é sempre:

File "separar_csv_por_uf.py", line 35 print('Erros de processamento: {}'.format(count_erro), end='\r') ^ SyntaxError: invalid syntax

Ele simplesmente ignora todo o início do arquivo e vai direto para a penúltima linha do código.

import settings import csv, codecs, os from header_dict import get_header_index

location = os.getenv('FILES_LOCATION')

file = 'empresas.csv'

with codecs.open(location + file, 'r+', 'utf-8') as empresas:

empresas = csv.reader(x.replace('\0', '') for x in empresas)

next(empresas,None)

count_sucesso = 0
count_erro = 0

if not os.path.exists(location + 'UFs/'):
    os.makedirs(location + 'UFs/')

for empresa in empresas:

    uf = empresa[get_header_index('uf')]

    try:
        uf_file = open(location + 'UFs/' + uf + ".csv", "a+")
    except:
        uf_file = open(location + 'UFs/' + uf + ".csv", "w+")

    try:
        uf_file.writelines('"' + '","'.join(empresa) + '"\n')
        count_sucesso += 1
    except:
        count_erro += 1

Linha 35 ->>> print('Erros de processamento: {}'.format(count_erro), end='\r')

    print('Empresas processadas: {}'.format(count_sucesso), end='\r')

Vcs poderiam me ajudar?

Aparentemente, seu problema está na sintaxe do comando do script de separação!

loop 'for' de iteração: `for empresa in empresas:

    uf = empresa[get_header_index('uf')]

    try:
        uf_file = open(location + 'UFs/' + uf + ".csv", "a+")
    except:
        uf_file = open(location + 'UFs/' + uf + ".csv", "w+")

    **try: ### não está conseguindo executar esta parte do bloco
        uf_file.writelines('"' + '","'.join(empresa) + '"\n')
        count_sucesso += 1**
    except: ### esta é a exceção do try acima
        count_erro += 1
        print('Erros de processamento: {}'.format(count_erro), end='\r')

    print('Empresas processadas: {}'.format(count_sucesso), end='\r')`
RF-Junior commented 3 years ago

cê fez opção pela geração dos arquivos csv. Você p

python3 cnpj.py ../../zip/ csv ./base/ --dir

rictom commented 3 years ago

Desculpe, vc falou que rodou pelo comando python separar_csv_por_uf.py, se estiver rodando pelo python 2.7, essa parte do print end='r' dá erro, porque essa sintaxe não é válida nessa versão do python. Então, o correto é python3 separar_csv_por_uf.py

elossio commented 3 years ago

cê fez opção pela geração dos arquivos csv. Você p

python3 cnpj.py ../../zip/ csv ./base/ --dir

Ele aceitou sem as aspas? Eu uso sempre aspas no comando, tipo python3 cnpj.py "pasta_arquivosZIP" csv "pasta_arquivosCSV" --dir

elossio commented 3 years ago

Desculpe, vc falou que rodou pelo comando python separar_csv_por_uf.py, se estiver rodando pelo python 2.7, essa parte do print end='r' dá erro, porque essa sintaxe não é válida nessa versão do python. Então, o correto é python3 separar_csv_por_uf.py

@RF-Junior Digite na linha de comando python --version (se a versão for 2.x). Tente também python3 --version

RF-Junior commented 3 years ago

Desculpe, vc falou que rodou pelo comando python separar_csv_por_uf.py, se estiver rodando pelo python 2.7, essa parte do print end='r' dá erro, porque essa sintaxe não é válida nessa versão do python. Então, o correto é python3 separar_csv_por_uf.py

Era isso mesmo... Obrigado

elossio commented 3 years ago

Desculpe, vc falou que rodou pelo comando python separar_csv_por_uf.py, se estiver rodando pelo python 2.7, essa parte do print end='r' dá erro, porque essa sintaxe não é válida nessa versão do python. Então, o correto é python3 separar_csv_por_uf.py

Era isso mesmo... Obrigado

Quer dizer então que você estava rodando o script com a versão 2.7 do Python? E agora com a versão 3.x, o script está separando certinho o arquivo empresas.csv em arquivos CSV por UF, ok?

RF-Junior commented 3 years ago

ntão que você estava rodando o script com a versão 2.7 do Python? E agora com a versão 3.x, o script está separando certinho o arquivo empresas.csv em arquivos CSV por UF, ok?

É isso mesmo. Desculpe pela burrada.

fabioserpa commented 3 years ago

@RF-Junior, que bom que conseguiu resolver. Fechando essa issue...