web-dev-qa-db-fra.com

Fichiers de téléchargement FTP Python

J'essaie de télécharger un fichier depuis un serveur Windows vers un serveur Unix (essentiellement en essayant de faire FTP). J'ai utilisé le code ci-dessous

#!/usr/bin/python
import ftplib
import os
filename = "MyFile.py"
ftp = ftplib.FTP("xx.xx.xx.xx")
ftp.login("UID", "PSW")
ftp.cwd("/Unix/Folder/where/I/want/to/put/file")
os.chdir(r"\\windows\folder\which\has\file")
ftp.storbinary('RETR %s' % filename, open(filename, 'w').write)

Je reçois l'erreur suivante:

Traceback (most recent call last):
  File "Windows\folder\which\has\file\MyFile.py", line 11, in <module>
    ftp.storbinary('RETR %s' % filename, open(filename, 'w').write)
  File "windows\folder\Python\lib\ftplib.py", line 466, in storbinary
    buf = fp.read(blocksize)
AttributeError: 'builtin_function_or_method' object has no attribute 'read'

Aussi tout le contenu de MyFile.py a été supprimé.

Quelqu'un peut-il indiquer ce qui ne va pas? J'ai lu que ftp.storbinary est utilisé pour télécharger des fichiers via FTP.

13
misguided

Si vous essayez de stocker un fichier non binaire (comme un fichier texte), essayez de le mettre en mode lecture au lieu du mode écriture.

ftp.storlines("STOR " + filename, open(filename, 'r'))

pour un fichier binaire (tout ce qui ne peut pas être ouvert dans un éditeur de texte) ouvrez votre fichier en mode lecture-binaire

ftp.storbinary("STOR " + filename, open(filename, 'rb'))

aussi, si vous prévoyez d'utiliser la bibliothèque ftp, vous devriez probablement suivre un tutoriel, je recommanderais ceci article de effbot.

16
John

Combiné les deux suggestions. La réponse finale étant

#!/usr/bin/python
import ftplib
import os
filename = "MyFile.py"
ftp = ftplib.FTP("xx.xx.xx.xx")
ftp.login("UID", "PSW")
ftp.cwd("/Unix/Folder/where/I/want/to/put/file")
os.chdir(r"\\windows\folder\which\has\file")
myfile = open(filename, 'r')
ftp.storlines('STOR ' + filename, myfile)
myfile.close()
8
misguided

essayez de faire du fichier un objet, afin de pouvoir le fermer à la fin de l'opération.

myfile = open(filename, 'w')
ftp.storbinary('RETR %s' % filename, myfile.write)

et à la fin du transfert

 myfile.close()

cela peut ne pas résoudre le problème, mais cela peut aider.

3
mbdavis

ftplib prend en charge l'utilisation des gestionnaires de contexte afin que vous puissiez le rendre encore plus simple en tant que tel

    with ftplib.FTP('ftp_address', 'user', 'pwd') as ftp, open(file_path, 'rb') as file:
        ftp.storbinary(f'STOR {file_path.name}', file)
        ...

De cette façon, vous êtes robuste contre les problèmes de fichiers et de ftp sans avoir à insérer des blocs try/except/finally. Et bien, c'est Pythonic.

PS: puisqu'il utilise des chaînes f est python> = 3.6 uniquement mais peut facilement être modifié pour utiliser l'ancienne syntaxe .format ()

0
gbonetti