Python: Как открыть файлы через Ftp с именем UTF-8 / Unicode? - PullRequest
1 голос
/ 14 мая 2019

Я хочу подключиться к 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, она показывает ???? и не может найти папку.

...