Python3.5 - Import multiple files from one folder

Asked

Viewed 589 times

1

I have the following code:

__author__ = 'Jones_Santos'
# !/usr/bin/python3
import os
from __init__ import mycursor, connection
import csv
import os
from datetime import datetime, date, timedelta, datetime

# Caminho do arquivo a ser importado
caminho_arquivo = './arquivos/analitico_carga_aedu_FC_17122017.csv'
nome_arquivo = os.path.basename('./arquivos/analitico_carga_aedu_FC_17122017.csv')


# ----------- Insere o nome do arquivo que está sendo importado no banco de dados
def inserir_nome_arquivo():
    data_importacao = datetime.now().date()
    query_inserir_nome_arquivo = ("INSERT IGNORE INTO arquivo "
                                  "(nome_arquivo, data_import) "
                                  "VALUES (%(nome_arquivo)s, %(data_import)s)")
    dados_nome_arquivo = {
        'nome_arquivo': nome_arquivo,
        'data_import': data_importacao,
    }
    mycursor.execute(query_inserir_nome_arquivo, dados_nome_arquivo)
    connection.commit()


query = 'SELECT id_arquivo FROM arquivo WHERE nome_arquivo = %(nome_arquivo)s'
criterios = {
    'nome_arquivo': nome_arquivo,
}
mycursor.execute(query, criterios)
for id_arquivo in mycursor:
    id_arquivos = int(("{}".format(id_arquivo).replace(',', '').replace('(', '').replace(')', '')))


def ler_e_inserir_arquivo_batimento():
    with open(caminho_arquivo, newline='', encoding="latin-1") as arquivo:
        conteudo = csv.reader(arquivo, delimiter=';')
        next(conteudo, None)
        for linha in conteudo:
            vr_parc = linha[8].replace(',', '.')
            menor_vcto = linha[2]
            query_sql_batimento = (
                "INSERT INTO batimento(id_arquivo,operacao,fase,menor_vcto,cpfcgc_pes,parcelado_tit,contrato_tit,"
                "compl_parc,numero_parc,vr_parc,vcto_parc,cod_unidade,pep)" "VALUES (%(id_arquivo)s,%(operacao)s, "
                "%(fase)s,%(menor_vcto)s,%(cpfcgc_pes)s, %(parcelado_tit)s, %(contrato_tit)s,%(compl_parc)s,"
                "%(numero_parc)s,%(vr_parc)s,%(vcto_parc)s,%(cod_unidade)s,%(pep)s) "
            )
            dados_sql_batimento = {
                'id_arquivo': id_arquivos,
                'operacao': linha[0],
                'fase': linha[1],
                'menor_vcto': datetime.strptime(menor_vcto[0:10], "%d/%m/%Y").strftime("%Y-%m-%d"),
                'cpfcgc_pes': linha[3],
                'parcelado_tit': linha[4],
                'contrato_tit': linha[5],
                'compl_parc': linha[6],
                'numero_parc': linha[7],
                'vr_parc': float(vr_parc),
                'vcto_parc': datetime.strptime(linha[9], "%d/%m/%Y").strftime("%Y-%m-%d"),
                'cod_unidade': linha[10],
                'pep': linha[11],
            }
            print(dados_sql_batimento)
            mycursor.execute(query_sql_batimento, dados_sql_batimento)
            connection.commit()


inserir_nome_arquivo()
ler_e_inserir_arquivo_batimento()
connection.close()

As you can see, I read the files and insert them into my Mysql database, but I always have to keep changing the name of the file with each new import. I want to know how to import the files as soon as they are saved in the folder. Example:

archive1.csv

if file 1.csv has already been imported:

do nothing

if not: import the file

I already store the file names that are imported into the bank:

# ----------- Insere o nome do arquivo que está sendo importado no banco de dados
def inserir_nome_arquivo():
    data_importacao = datetime.now().date()
    query_inserir_nome_arquivo = ("INSERT IGNORE INTO arquivo "
                                  "(nome_arquivo, data_import) "
                                  "VALUES (%(nome_arquivo)s, %(data_import)s)")
    dados_nome_arquivo = {
        'nome_arquivo': nome_arquivo,
        'data_import': data_importacao,
    }
    mycursor.execute(query_inserir_nome_arquivo, dados_nome_arquivo)
    connection.commit()

For now I’m stuck in this part. Check if I’ve imported the file, if not imported, I import.

Doubt: You can let python "scan" the folder for a new file?

  • Take a look here https://stackoverflow.com/questions/373335/how-do-i-get-a-cron-like-scheduler-in-python It will depend on the environment you run but the idea is to run a scheduled task to check, from time to time, if there are new files to be imported

  • Here also https://code.tutsplus.com/tutorials/managing-cron-jobs-using-python--cms-28231

  • Thanks, I’ll read the references

  • @Leonardopessoa got into the two posts you left as a reference and I was able to mount a read of the name of all the files in the folder, but I couldn’t do the following: Have I already imported the file? Yes, so I do nothing I already imported the file? No, then import this file

  • Update your response with your new code

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.