python - Python:如何使用 UTF-8/Unicode 名称通过 Ftp 打开文件?
问题描述
我想连接到 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
在其他目录中没有问题。如何遍历这些文件夹或打开它们?
更新:(更多信息)
更多信息与评论中建议debug_level
的snakecharmerb:我使用了这段代码(在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 名称的文件夹时,它显示????
并且找不到该文件夹。
解决方案
推荐阅读
- java - 排序数组(DONE)并显示原始索引(HALF INCORRECT?)
- javascript - JavaScript和Python中模运算的不同结果
- nginx - 通过 Nginx 反向代理隐藏域文件夹
- python - Python chr() 函数
- alamofire - 如何在 Xcode 中抑制 Alamofire 输出以调试控制台
- python - 发生异常时如何启动多行调试
- python - Keras ValueError related to input shape in 1D Convolutional Neural Network
- javascript - TypeScript 抱怨 React Bootstrap 中缺少组件
- git - 从 Google Cloud Build 访问 Github 存储库
- php - XAMPP phpMyAdmin 用户'root'@'localhost'的访问被拒绝(使用密码:否)