Я хочу подключиться к FTP-серверу, получить файлы и перебрать элементы с помощью Python.но имена папок - персидские / арабские, и когда я хочу открыть любую папку, она возвращает следующее:
error_perm: 550 The filename, directory name, or volume label syntax is incorrect.
вот что я пробовал:
from ftplib import FTP
import os
ftp = FTP(host_address)
ftp.login(user=user_name,passwd=password)
ftp.encoding='utf-8'
ftp.cwd("تست")
и
ftp = FTP(host_address,user_name,password)
ftp.encoding='utf-8'
ftp.cwd("تست")
и
with FTP(host_address) as ftp:
ftp.login(user=user_name,passwd=password)
ftp.encoding='utf-8'
и
import ftputil
with ftputil.FTPHost(host_address, user_name, password) as ftp_host:
print (ftp_host.listdir(ftp_host.curdir))
...
текущий каталог на сервере выглядит примерно так:
test
new folder
شیراز
تهران
تست
, и если я получаю список элементов текущего каталога через python, он дает мне что-то вроде этого:
test
new folder
?????
?????
???
с этими методами, я использовал до сих пор нет проблем считать файлы в test
или new folder
, но не в других каталогах.как я могу перебирать эти папки или открывать их?
update: (больше информации)
больше информации с debug_level
как snakecharmerb , предложенным в комментариях:Я использовал этот код (пробовал в Ubuntu Terminal и Eclipse, Jupiter lab и ipython):
#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
from ftplib import FTP
import os
from six import u as unicode
host_address = "**********"
user_name = "***********"
password = "********"
ftp = FTP(host_address)
ftp.login(user=user_name,passwd=password)
ftp.set_debuglevel(2)
ftp.pwd()
for item in ftp.nlst():
print(item)
ftp.cwd(item)
ftp.retrlines("LIST")
ftp.cwd("../")
, и это вывод:
*cmd* 'PWD'
*put* 'PWD\r\n'
*get* '257 "/" is current directory.\r\n'
*resp* '257 "/" is current directory.'
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A.\r\n'
*resp* '200 Type set to A.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (192,168,22,3,20,18).\r\n'
*resp* '227 Entering Passive Mode (192,168,22,3,20,18).'
*cmd* 'NLST'
*put* 'NLST\r\n'
*get* '125 Data connection already open; Transfer starting.\r\n'
*resp* '125 Data connection already open; Transfer starting.'
*get* '226 Transfer complete.\r\n'
*resp* '226 Transfer complete.'
all file
*cmd* 'CWD all file'
*put* 'CWD all file\r\n'
*get* '250 CWD command successful.\r\n'
*resp* '250 CWD command successful.'
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A.\r\n'
*resp* '200 Type set to A.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (192,168,22,3,20,19).\r\n'
*resp* '227 Entering Passive Mode (192,168,22,3,20,19).'
*cmd* 'LIST'
*put* 'LIST\r\n'
*get* '125 Data connection already open; Transfer starting.\r\n'
*resp* '125 Data connection already open; Transfer starting.'
11-21-18 11:12AM <DIR> CpayImageView Code dar Jadid
11-21-18 11:13AM <DIR> New folder
11-21-18 11:13AM <DIR> UltraSearch-x64
11-21-18 11:13AM <DIR> UltraSearch-x86
*get* '226 Transfer complete.\r\n'
*resp* '226 Transfer complete.'
*cmd* 'CWD ../'
*put* 'CWD ../\r\n'
*get* '250 CWD command successful.\r\n'
*resp* '250 CWD command successful.'
New folder
*cmd* 'CWD New folder'
*put* 'CWD New folder\r\n'
*get* '250 CWD command successful.\r\n'
*resp* '250 CWD command successful.'
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A.\r\n'
*resp* '200 Type set to A.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (192,168,22,3,20,20).\r\n'
*resp* '227 Entering Passive Mode (192,168,22,3,20,20).'
*cmd* 'LIST'
*put* 'LIST\r\n'
*get* '125 Data connection already open; Transfer starting.\r\n'
*resp* '125 Data connection already open; Transfer starting.'
*get* '226 Transfer complete.\r\n'
*resp* '226 Transfer complete.'
*cmd* 'CWD ../'
*put* 'CWD ../\r\n'
*get* '250 CWD command successful.\r\n'
*resp* '250 CWD command successful.'
p2512067424
*cmd* 'CWD p2512067424'
*put* 'CWD p2512067424\r\n'
*get* '250 CWD command successful.\r\n'
*resp* '250 CWD command successful.'
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A.\r\n'
*resp* '200 Type set to A.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (192,168,22,3,20,21).\r\n'
*resp* '227 Entering Passive Mode (192,168,22,3,20,21).'
*cmd* 'LIST'
*put* 'LIST\r\n'
*get* '150 Opening ASCII mode data connection.\r\n'
*resp* '150 Opening ASCII mode data connection.'
06-19-17 09:10AM <DIR> 1396-03-03
06-19-17 09:10AM <DIR> 1396-03-04
06-19-17 09:10AM <DIR> 1396-03-06
06-19-17 09:11AM <DIR> 1396-03-07
06-19-17 09:11AM <DIR> 1396-03-08
06-19-17 09:11AM <DIR> 1396-03-09
06-19-17 09:11AM <DIR> 1396-03-10
06-19-17 09:11AM <DIR> 1396-03-11
06-19-17 09:12AM <DIR> 1396-03-13
06-19-17 09:12AM <DIR> 1396-03-16
06-19-17 09:12AM <DIR> 1396-03-17
06-19-17 09:12AM <DIR> 1396-03-18
*get* '226 Transfer complete.\r\n'
*resp* '226 Transfer complete.'
*cmd* 'CWD ../'
*put* 'CWD ../\r\n'
*get* '250 CWD command successful.\r\n'
*resp* '250 CWD command successful.'
?????
*cmd* 'CWD ?????'
*put* 'CWD ?????\r\n'
*get* '550 The filename, directory name, or volume label syntax is incorrect. \r\n'
*resp* '550 The filename, directory name, or volume label syntax is incorrect. '
Traceback (most recent call last):
File "/home/h128/work_space3/ftppython/ftppythonteset.py", line 21, in <module>
ftp.cwd(item)
File "/usr/lib/python2.7/ftplib.py", line 574, in cwd
return self.voidcmd(cmd)
File "/usr/lib/python2.7/ftplib.py", line 256, in voidcmd
return self.voidresp()
File "/usr/lib/python2.7/ftplib.py", line 231, in voidresp
resp = self.getresp()
File "/usr/lib/python2.7/ftplib.py", line 226, in getresp
raise error_perm, resp
ftplib.error_perm: 550 The filename, directory name, or volume label syntax is incorrect.
вы видите, пока он перебираетУ папок с английским именем у него нет проблем, он может войти в папку, распечатать список файлов в этой папке и затем вернуться в верхнюю папку.но когда появляется папка с именем utf-8, она показывает ????
и не может найти папку.