-
FTP tramite python
Come da titolo non riesco ad inviare
un file txt sul mio sito postato su altervista.
Ho seguito le indicazioni del tutorial su: https://www.worthwebscraping.com, ebbene se faccio
la prova con il sito: dlptest.com, tutto funziona. Riesco a fare upload ed anche il donwload.
Non appena metto le credenziali del mio sito ricevo questo errore:
************************************************** **************************************
Traceback (most recent call last):
File "C:/ftppy/ftpaiaz.py", line 9, in <module>
ftp = ftplib.FTP(FTP_HOST, FTP_USER, FTP_PASS)
File "C:\Program Files\lib\ftplib.py", line 119, in __init__
self.connect(host)
File "C:\Program Files\lib\ftplib.py", line 160, in connect
self.welcome = self.getresp()
File "C:\Program Files\lib\ftplib.py", line 242, in getresp
resp = self.getmultiline()
File "C:\Program Files\lib\ftplib.py", line 228, in getmultiline
line = self.getline()
File "C:\Program Files\lib\ftplib.py", line 210, in getline
line = self.file.readline(self.maxline + 1)
File "C:\Program Files\lib\codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 104: invalid continuation byte
************************************************** ***********************************************
Il codice da me usato è:
Codice:
import ftplib
FTP_HOST = "ftp.aiazzone.altervista.org"
FTP_USER = "aiazzone"
FTP_PASS = "***********"
# connect to the FTP server
ftp = ftplib.FTP(FTP_HOST, FTP_USER, FTP_PASS)
# force UTF-8 encoding
ftp.encoding = "utf-8"
# local file name you want to upload
filename = "file.txt"
with open(filename, "rb") as file:
# use FTP's STOR command to upload the file
ftp.storbinary("STOR file.txt", file)
# the name of file you want to download from the FTP server
filename = 'file.txt'
with open(filename, "wb") as file:
# use FTP's RETR command to download the file
ftp.retrbinary("RETR file.txt", file.write)
# list current files & directories
ftp.dir()
# quit and close the connection
ftp.quit()
Ho scaricato ed eseguito il test di alervista e questo è il risultato:
Risposta da un server non autorevole:
Server: UnKnown
Address: 192.168.1.1
Nome: aiazzone.altervista.org
Address: 138.201.222.27
Risposta da un server non autorevole:
Server: UnKnown
Address: 192.168.1.1
Nome: ftp.aiazzone.altervista.org
Address: 138.201.222.27
Traccia instradamento verso aiazzone.altervista.org [138.201.222.27]
su un massimo di 30 punti di passaggio:
1 1 ms 2 ms 1 ms USB_SCHILLACI [192.168.1.1]
2 48 ms 40 ms 47 ms host-37-99-248-238.geny.it [37.99.248.238]
3 30 ms 26 ms 29 ms host-37-99-248-237.geny.it [37.99.248.237]
4 34 ms 38 ms 32 ms 20-228-157-185.fibertelecom.it [185.157.228.20]
5 67 ms 58 ms 72 ms 53-228-157-185.fibertelecom.it [185.157.228.53]
6 * * * Richiesta scaduta.
7 80 ms 77 ms 68 ms core24.fsn1.hetzner.com [213.239.252.42]
8 63 ms 67 ms 66 ms ex9k3.dc8.fsn1.hetzner.com [213.239.229.142]
9 * * * Richiesta scaduta.
10 * * * Richiesta scaduta.
11 * * * Richiesta scaduta.
12 * * * Richiesta scaduta.
13 * * * Richiesta scaduta.
14 * * * Richiesta scaduta.
15 * * * Richiesta scaduta.
16 * * * Richiesta scaduta.
17 * * * Richiesta scaduta.
18 * * * Richiesta scaduta.
19 * * * Richiesta scaduta.
20 * * * Richiesta scaduta.
21 * * * Richiesta scaduta.
22 * * * Richiesta scaduta.
23 * * * Richiesta scaduta.
24 * * * Richiesta scaduta.
25 * * * Richiesta scaduta.
26 * * * Richiesta scaduta.
27 * * * Richiesta scaduta.
28 * * * Richiesta scaduta.
29 * * * Richiesta scaduta.
30 * * * Richiesta scaduta.
Traccia completata.
Grazie in anticipo per un eventuale aiuto.
Lanfranco Schillaci
laschil@gmail.com
-
Salve,
provi a togliere ftp da FTP_HOST.
Cordiali saluti.
-
Puoi restringere il codice al solo login?
Imposta Latin-1 nella connessione e poi altro per i file.
https://docs.python.org/3/library/ftplib.html
Con il sottodominio ftp è la sintassi corretta.
In Latin-1 esadecimale E8 corrisponde al carattere è e grave, che in UTF-8 può essere rappresentato da un carattere a due byte (in sintesi E8 non esiste per UTF-8 ma C3A8) probabilmente il server risponde in LATIN-1 indicando che il login non funziona (ergo comunque sequenza valida o meno non riconosce le credenziali).
-
Grazie a tutti per le risposte. Ho risolto leggendomi per bene https://docs.python.org/3/library/ftplib.html
Posto il codice che ho usato:
from ftplib import FTP
filename = 'ftpclient.py'
file_copy = 'lettera.txt'
ftp = FTP('ftp.aiazzone.altervista.org','*******','***** ***',encoding = 'Latin-1')
try:
with open(file_copy, 'wb') as fp:
res = ftp.retrbinary('RETR ' + file_copy, fp.write)
if not res.startswith('226 Transfer complete'):
print('Download complete')
except ftplib.all_errors as e:
print('FTP error:', e)
try:
with open(filename, 'rb') as fp:
res = ftp.storlines("STOR " + filename, fp)
if not res.startswith('226 Transfer complete'):
print('Upload complete')
except ftplib.all_errors as e:
print('FTP error:', e)
ftp.dir()
ftp.quit()
-
Comunque qui in altervista puoi anche usare FTPS con porta 21 e connessione esplicita. https://www.ftptoday.com/blog/explic...u-need-to-know
Te lo dico perché ti vedo programmare bene, quindi occorre la documentazione della libreria per conoscere cosa fa esattamente nonché guardare anche il codice della libreria.
Il debug va interpretato a piccoli passi, Il codice si riduce al minimo in modo da restringere l'origine dell'errore. (Si è a tentativi e a volte occorre fortuna).
Da python 3 per aprire o chiudere un un'oggetto file esiste il terzo parametro enconding
Codice:
myfile = open('alice.txt', encoding='utf-8') # Reading a UTF-8 file; 'r' is omitted
myfile = open('alice.txt', 'wb', encoding='utf-8') # File will be written in UTF-8
questo occorre quando l'origine è con enconding conosciuto/valido da trasformare in altra codifica (Ovviamente entrambe le codifiche devono usare gli stessi caratteri per una conversione da Latin-1 E8 esadecimale a UTF-8 esadecimale C3A8, altrimenti sarà un file danneggiato).
Però ovviamente la libreria si aspetta lo stesso enconding se presente in __init__ altrimenti il default utf-8. https://docs.python.org/3/library/so...ocket.makefile