Python: como acessar um arquivo de um diretório na rede e mover para o servidor do seu projeto

Logotipo Python

Olá, tudo bem?

Neste post mostrarei como resolver um problema: acessar um arquivo que está na sua rede local/empresarial Windows e que usa o servidor Samba. Não é muito complicado. Vamos lá!

Neste post, vou falar do problema que tive e como resolvi. Se você só quer a solução, vá para o segundo tópico.

O problema

Eu precisava pegar alguns arquivos que estavam na rede da minha empresa (Windows e Samba) e puxá-los para o diretório do meu projeto Django, que estava num servidor Linux. Tentei o seguinte e não funcionou:

import shutil

source_path = "smb://server-name/GRUPOS/TECNOLOGIA_INFORMACAO/Dashboard Diretoria/" 
dest_path = "./static/reports/". # This is my static folder where I want to move the file 
file_name = "general_reports.csv" 
shutil.copyfile(source_path + file_name, dest_path + file_name)

O erro que dava era o seguinte:

[Errno 2] No such file or directory: ‘smb://server-name/GRUPOS/TECNOLOGIA_INFORMACAO/Dashboard Diretoria/general_reports.csv’

Tecnologias que estava usando no momento:

  • Biblioteca shutil;
  • SO: MacOS e depois iria importar para o servidor Linux Ubuntu;
  • Python 3.6;
  • Django 2.0.5
  • Rede Windows/Samba (Linux),

A solução

Para solucionar o problema, é necessário importar uma biblioteca do Python para o Samba e adicionar diversos dados. Vamos ao passo a passo:

  1. Instale a Biblioteca pysmb (https://pypi.org/project/pysmb/):
    pip install pysmb
  2. Importe a biblioteca para seu código/arquivo .py:
    import shutil
    from smb.SMBConnection import SMBConnection
  3. Para listar todos os arquivos de um diretório:
    server_ip = "10.110.10.10" # Coloque aqui o IP do seu servidor
    server_name = 'myserver' # Coloque aqui o nome do seu servidor
    share_name = "GRUPOS" # Esse é o nome do principal diretório da rede onde você deseja conectar
    network_username = 'myuser' # Esse é o seu nome de usuário na rede
    network_password = '***' # Essa é sua senha de rede
    machine_name = 'myuser@mac-mc70006405' # O nome do seu computador. Para saber, acesse o terminal
    conn = SMBConnection(network_username, network_password, machine_name, server_name, use_ntlm_v2 = True)
    assert conn.connect(server_ip, 139)
    files = conn.listPath(share_name, "/TECNOLOGIA_INFORMACAO/Dashboard Diretoria/") # Coloque aqui o caminho completo
    for item in files:
       print(item.filename)

    O código acima irá imprimir no console/terminal todos os arquivos que forem encontrados.

  4. Para copiar um ou mais arquivos:
# Verifica se o arquivo que queremos está lá
sf = conn.getAttributes(share_name, "general_reports.csv")
print sf.file_size # Imprime o tamanho do arquivo
print sf.filename # Imprime o nome do arquivo

# Cria um arquivo temporário para a transferência
file_obj = tempfile.NamedTemporaryFile(mode='w+t', delete=False)
file_name = file_obj.name
file_attributes, copysize = conn.retrieveFile(share_name, "general_reports.csv", file_obj)
print copysize
file_obj.close()

# Copia o arquivo temporário para o diretório que você queria
shutil.copy(file_name, "diretorio-novo/general_reports.csv")

# Fecha a conexão
conn.close()

É isso aí, espero ter ajudado!

Seus comentários são muito apreciados.

This site uses Akismet to reduce spam. Learn how your comment data is processed.