2

我想连接到 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 
?????
?????
???

使用这些方法,到目前为止,我已经使用过在其他目录中读取文件没有问题,testnew folder在其他目录中没有问题。如何遍历这些文件夹或打开它们?

更新:(更多信息)
更多信息与评论中建议debug_levelsnakecharmerb:我使用了这段代码(在ubuntu终端和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 名称的文件夹时,它显示????并且找不到该文件夹​​。

4

0 回答 0