Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Para ler, rodar umas linhas de codigo e salvar varios arquivos excel

Boa tarde! tenho muita dificuldade sobre isso...

import glob
arquivos = glob.glob('Local*.xlsx')
for x in arquivos:
    dados = pd.ExcelFile(x)
    data = pd.read_excel(dados)
    data.index = data['ano']
    novo = data.stack()

e depois preciso salvar essa variável novo em um novo arquivo com o mesmo nome em outra pasta do diretório.

Vocês poderiam me ajudar, por favor!

8 respostas
solução!

Oi Kamila, como vai? Espero que esteja bem ^-^

Perdão pela demora em obter um retorno. Vou explicar passo a passo o trecho de código que postou. Tudo bem?!

Através da biblioteca glob conseguiremos buscar na pasta atual os nomes de arquivos que correspondem a um padrão específico. E através da linha abaixo estamos definido que queremos os arquivos que comecem com o nome Local e sejam do tipo .xlsx:

arquivos = glob.glob('Local*.xlsx')

A variável arquivos será uma lista de todos os arquivos que correspondem ao padrão especificado.

Após fazermos a varredura da pasta e descobrirmos todos os nomes de arquivos que correspondem ao padrão, iremos percorrer um a um. Isso ocorre quando utilizamos a estrutura de repetição for.

for x in arquivos

A variável x irá nos devolver o nome de cada arquivo que foi encontrado.

Dentro do laço iremos fazer a leitura de cada arquivo pelo seu nome (read_excel). E por fim, organizamos todas as outras colunas do arquivo para serem agrupadas pelo ano (quando utilizamos a função stack).

Vamos para uma demonstração prática:

Suponha o seguinte arquivo excel que seja nomeado como Local1:

image

Quando executarmos o código e printarmos a variável novo, o resultado será o seguinte:

image

Observe que o resultado está agrupado por ano.

Quanto a salvar esse resultado em um novo arquivo em um outro diretório, podemos definir uma variável com o caminho da pasta e após isso, redirecionar a saída apresentada acima. Para que a saída seja salva em um novo arquivo excel podemos utilizar a função to_excel.

Veja:

import glob
import pandas as pd
arquivos = glob.glob('Local*.xlsx')
endereco_da_pasta = 'C:/Users/nadia/Documents/Excel'
for x in arquivos:
    dados = pd.ExcelFile(x)
    data = pd.read_excel(dados)
    data.index = data['ano']
    novo = data.stack()
    novo.to_excel(f'{endereco_da_pasta}/{x}')

Qualquer dúvida é só dizer, estou por aqui, tá bom?

Abraços e bons estudos!

Muito obrigada, Nádia. Você me salvou de fazer isso mais de 100 vezes na mão. Eu ia voltar para o excel. kkkk

Nádia, tem como eu pegar a segunda coluna de todas as pastas e juntar em uma só pasta para que eu possa fazer minha análise?

Kamila, que bom que ajudou de alguma forma hahaha

Sobre sua pergunta, qual é a saída que você espera nesse arquivo que teria todas as segundas colunas? Poderia dar um exemplo? Para postar uma imagem aqui no fórum, basta fazer o upload dela no Imgur e postar o link na resposta =)

Poderia ser uma única coluna com todos os resultados das segundas colunas? Exemplo:

image

Aguardo mais informações para te ajudar, tá bom?

Bom dia, Nádia.

Tenho os dados que vc me ajudou fazer. Agora preciso pegar as colunas [0 ]e [1] para fazer um novo dataframe e inserir a coluna [2] de todos os arquivos para que use as informações dos locais em uma analise. https://imgur.com/xc81WUB https://imgur.com/m2XxnLH

Desde já agradeço pelo help

Nádia, tem como eu pegar a segunda coluna de todas as pastas e juntar em uma só pasta para que eu possa fazer minha análise?

Kamila, para fazer isso, podemos utilizar a função iloc e passarmos o índice da coluna que queremos. Por padrão, a coluna começará com o número 0 e como queremos a segunda coluna, o índice que procuramos é o índice 1. No código abaixo criei uma lista para armazenar os dados de todas as segundas colunas e utilizamos o trecho do código anterior para fazer essa captura:

import glob
import pandas as pd
from pandas import ExcelWriter

arquivos = glob.glob('Local*.xlsx')
endereco_da_pasta = 'C:/Users/nadia/Documents/Excel'

dados_da_segunda_coluna = []

for nome_arquivo in arquivos:
    data = pd.read_excel(nome_arquivo)
    segunda_coluna_do_arquivo = data.iloc[:,1]
    dados_da_segunda_coluna.append(segunda_coluna_do_arquivo)
    data.index = data['ano']
    novo = data.stack()
    novo.to_excel(f'{endereco_da_pasta}/{nome_arquivo}')

Após isso, percorremos esses dados da lista e colocamos em uma planilha auxiliar, onde cada aba da planilha corresponderá a segunda coluna de um arquivo, por exemplo:

for indice in range(len(dados_da_segunda_coluna)):
    with ExcelWriter('comparacao_segunda_coluna.xlsx', mode='a') as writer:
        dados_da_segunda_coluna[indice].to_excel(writer, sheet_name='SegundaColunaArquivo')

image

E por fim, criamos o arquivo final que conterá todos os resultados juntos:

resultado = pd.concat(pd.read_excel('comparacao_segunda_coluna.xlsx', sheet_name=None), ignore_index=True)
resultado.to_excel(f'{endereco_da_pasta}/resultado_segunda_coluna.xlsx')

exemplo

Vale ressaltar que nesse exemplo acima que o arquivo está sendo salvo com os índices de cada valor, então por exemplo: 0,1,2 corresponde aos índices do primeiro arquivo. Os próximos 0,1,2 aos índices do segundo arquivo e assim por diante.

Da forma como mostrei, você terá todos os dados brutos em um só lugar e agora decidirá o que fará com eles. Talvez seja necessário alguma reorganização, mas a parte manual de carregar o dado de cada coluna está automatizada.

Código completo:

import glob
import pandas as pd
from pandas import ExcelWriter

arquivos = glob.glob('Local*.xlsx')
endereco_da_pasta = 'C:/Users/nadia/Documents/Excel'

dados_da_segunda_coluna = []

for nome_arquivo in arquivos:
    data = pd.read_excel(nome_arquivo)
    segunda_coluna_do_arquivo = data.iloc[:,1]
    dados_da_segunda_coluna.append(segunda_coluna_do_arquivo)
    data.index = data['ano']
    novo = data.stack()
    novo.to_excel(f'{endereco_da_pasta}/{nome_arquivo}')


for indice in range(len(dados_da_segunda_coluna)):
    with ExcelWriter('comparacao_segunda_coluna.xlsx', mode='a') as writer:
        dados_da_segunda_coluna[indice].to_excel(writer, sheet_name='SegundaColunaArquivo')

resultado = pd.concat(pd.read_excel('comparacao_segunda_coluna.xlsx', sheet_name=None), ignore_index=True)
resultado.to_excel(f'{endereco_da_pasta}/resultado_segunda_coluna.xlsx')

Obs: crie um arquivo excel em branco na pasta onde está executando o código com o nome comparacao_segunda_coluna e após isso execute o código.

Qualquer dúvida é só falar, estou por aqui, tá bom?

Abraços e bons estudos!

Nádia, tudo bem?

No código da organização, apenas a primeira pasta ficou ok. Agora que percebi...

No último código apareceu um erro no mode='a' => ValueError: Append mode is not supported with xlsxwriter! fiz um compartilhamento do código: https://1drv.ms/u/s!AvODW46CmNdM0EVQirqei2uOSH_p?e=rBgYZy

Muito obrigada por tudo! Abraços

P.S: Essa parte de automatização eu tenho muita vontade de aprender. Desculpe-me qualquer coisa!

No código da organização, apenas a primeira pasta ficou ok. Agora que percebi...

O código foi projetado para que tivessem vários arquivos. Percebi no arquivo que compartilhou comigo que são várias abas.

Sobre esse erro do último código, algo que pode tentar é modificar essa linha:

 ExcelWriter('comparacao_segunda_coluna.xlsx', mode='a')

Para:

 ExcelWriter('comparacao_segunda_coluna.xlsx', engine='openpyxl', mode='a')

Kamila, não há o que pedir desculpas. Estou aqui para ajudar e fico muito feliz em ajudar de alguma forma. Se tiver mais alguma que eu possa fazer por você, estou a disposição =)

Infelizmente na plataforma não temos cursos que cobrem essa parte de automatização, mas sempre que houver dúvidas, abra um novo tópico aqui no fórum que tentaremos te ajudar.

Grande abraço!

Obrigada! São vários arquivos. Esse coloquei para exemplo... Abraços