- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
自从我开始使用 Internet 以来,我一直想创建自己的 ftp 客户端。现在我正在学习 Python,我正在考虑创建一个作为练习/个人项目。
我在想,
ftplib
就足够了吗?或者您会推荐另一个图书馆(最好是有好的文档的图书馆)吗?如果有任何指导/帮助,我将不胜感激。提前致谢! :)
最佳答案
听起来您想制作一个具有 GUI 的程序。我可以推荐在您的应用程序的那部分使用 PyQt 吗? ftplib 应该适合您的 FTP 支持,您可以找到文档 right here .
或者对于 FTP 支持,您可以使用 PyQt 框架的 QtNetwork 模块中的 QFtp 类。以下是 PyQt 附带的 FTP 客户端示例。图片随附。
#!/usr/bin/env python
"""PyQt4 port of the network/ftp example from Qt v4.x"""
# This is only needed for Python v2 but is harmless for Python v3.
import sip
sip.setapi('QString', 2)
from PyQt4 import QtCore, QtGui, QtNetwork
import ftp_rc
class FtpWindow(QtGui.QDialog):
def __init__(self, parent=None):
super(FtpWindow, self).__init__(parent)
self.isDirectory = {}
self.currentPath = ''
self.ftp = None
self.outFile = None
ftpServerLabel = QtGui.QLabel("Ftp &server:")
self.ftpServerLineEdit = QtGui.QLineEdit('ftp.trolltech.com')
ftpServerLabel.setBuddy(self.ftpServerLineEdit)
self.statusLabel = QtGui.QLabel("Please enter the name of an FTP server.")
self.fileList = QtGui.QTreeWidget()
self.fileList.setEnabled(False)
self.fileList.setRootIsDecorated(False)
self.fileList.setHeaderLabels(("Name", "Size", "Owner", "Group", "Time"))
self.fileList.header().setStretchLastSection(False)
self.connectButton = QtGui.QPushButton("Connect")
self.connectButton.setDefault(True)
self.cdToParentButton = QtGui.QPushButton()
self.cdToParentButton.setIcon(QtGui.QIcon(':/images/cdtoparent.png'))
self.cdToParentButton.setEnabled(False)
self.downloadButton = QtGui.QPushButton("Download")
self.downloadButton.setEnabled(False)
self.quitButton = QtGui.QPushButton("Quit")
buttonBox = QtGui.QDialogButtonBox()
buttonBox.addButton(self.downloadButton,
QtGui.QDialogButtonBox.ActionRole)
buttonBox.addButton(self.quitButton, QtGui.QDialogButtonBox.RejectRole)
self.progressDialog = QtGui.QProgressDialog(self)
self.fileList.itemActivated.connect(self.processItem)
self.fileList.currentItemChanged.connect(self.enableDownloadButton)
self.progressDialog.canceled.connect(self.cancelDownload)
self.connectButton.clicked.connect(self.connectOrDisconnect)
self.cdToParentButton.clicked.connect(self.cdToParent)
self.downloadButton.clicked.connect(self.downloadFile)
self.quitButton.clicked.connect(self.close)
topLayout = QtGui.QHBoxLayout()
topLayout.addWidget(ftpServerLabel)
topLayout.addWidget(self.ftpServerLineEdit)
topLayout.addWidget(self.cdToParentButton)
topLayout.addWidget(self.connectButton)
mainLayout = QtGui.QVBoxLayout()
mainLayout.addLayout(topLayout)
mainLayout.addWidget(self.fileList)
mainLayout.addWidget(self.statusLabel)
mainLayout.addWidget(buttonBox)
self.setLayout(mainLayout)
self.setWindowTitle("FTP")
def sizeHint(self):
return QtCore.QSize(500, 300)
def connectOrDisconnect(self):
if self.ftp:
self.ftp.abort()
self.ftp.deleteLater()
self.ftp = None
self.fileList.setEnabled(False)
self.cdToParentButton.setEnabled(False)
self.downloadButton.setEnabled(False)
self.connectButton.setEnabled(True)
self.connectButton.setText("Connect")
self.setCursor(QtCore.Qt.ArrowCursor)
return
self.setCursor(QtCore.Qt.WaitCursor)
self.ftp = QtNetwork.QFtp(self)
self.ftp.commandFinished.connect(self.ftpCommandFinished)
self.ftp.listInfo.connect(self.addToList)
self.ftp.dataTransferProgress.connect(self.updateDataTransferProgress)
self.fileList.clear()
self.currentPath = ''
self.isDirectory.clear()
url = QtCore.QUrl(self.ftpServerLineEdit.text())
if not url.isValid() or url.scheme().lower() != 'ftp':
self.ftp.connectToHost(self.ftpServerLineEdit.text(), 21)
self.ftp.login()
else:
self.ftp.connectToHost(url.host(), url.port(21))
user_name = url.userName()
if user_name:
try:
# Python v3.
user_name = bytes(user_name, encoding='latin1')
except:
# Python v2.
pass
self.ftp.login(QtCore.QUrl.fromPercentEncoding(user_name), url.password())
else:
self.ftp.login()
if url.path():
self.ftp.cd(url.path())
self.fileList.setEnabled(True)
self.connectButton.setEnabled(False)
self.connectButton.setText("Disconnect")
self.statusLabel.setText("Connecting to FTP server %s..." % self.ftpServerLineEdit.text())
def downloadFile(self):
fileName = self.fileList.currentItem().text(0)
if QtCore.QFile.exists(fileName):
QtGui.QMessageBox.information(self, "FTP",
"There already exists a file called %s in the current "
"directory." % fileName)
return
self.outFile = QtCore.QFile(fileName)
if not self.outFile.open(QtCore.QIODevice.WriteOnly):
QtGui.QMessageBox.information(self, "FTP",
"Unable to save the file %s: %s." % (fileName, self.outFile.errorString()))
self.outFile = None
return
self.ftp.get(self.fileList.currentItem().text(0), self.outFile)
self.progressDialog.setLabelText("Downloading %s..." % fileName)
self.downloadButton.setEnabled(False)
self.progressDialog.exec_()
def cancelDownload(self):
self.ftp.abort()
def ftpCommandFinished(self, _, error):
self.setCursor(QtCore.Qt.ArrowCursor)
if self.ftp.currentCommand() == QtNetwork.QFtp.ConnectToHost:
if error:
QtGui.QMessageBox.information(self, "FTP",
"Unable to connect to the FTP server at %s. Please "
"check that the host name is correct." % self.ftpServerLineEdit.text())
self.connectOrDisconnect()
return
self.statusLabel.setText("Logged onto %s." % self.ftpServerLineEdit.text())
self.fileList.setFocus()
self.downloadButton.setDefault(True)
self.connectButton.setEnabled(True)
return
if self.ftp.currentCommand() == QtNetwork.QFtp.Login:
self.ftp.list()
if self.ftp.currentCommand() == QtNetwork.QFtp.Get:
if error:
self.statusLabel.setText("Canceled download of %s." % self.outFile.fileName())
self.outFile.close()
self.outFile.remove()
else:
self.statusLabel.setText("Downloaded %s to current directory." % self.outFile.fileName())
self.outFile.close()
self.outFile = None
self.enableDownloadButton()
self.progressDialog.hide()
elif self.ftp.currentCommand() == QtNetwork.QFtp.List:
if not self.isDirectory:
self.fileList.addTopLevelItem(QtGui.QTreeWidgetItem(["<empty>"]))
self.fileList.setEnabled(False)
def addToList(self, urlInfo):
item = QtGui.QTreeWidgetItem()
item.setText(0, urlInfo.name())
item.setText(1, str(urlInfo.size()))
item.setText(2, urlInfo.owner())
item.setText(3, urlInfo.group())
item.setText(4, urlInfo.lastModified().toString('MMM dd yyyy'))
if urlInfo.isDir():
icon = QtGui.QIcon(':/images/dir.png')
else:
icon = QtGui.QIcon(':/images/file.png')
item.setIcon(0, icon)
self.isDirectory[urlInfo.name()] = urlInfo.isDir()
self.fileList.addTopLevelItem(item)
if not self.fileList.currentItem():
self.fileList.setCurrentItem(self.fileList.topLevelItem(0))
self.fileList.setEnabled(True)
def processItem(self, item):
name = item.text(0)
if self.isDirectory.get(name):
self.fileList.clear()
self.isDirectory.clear()
self.currentPath += '/' + name
self.ftp.cd(name)
self.ftp.list()
self.cdToParentButton.setEnabled(True)
self.setCursor(QtCore.Qt.WaitCursor)
def cdToParent(self):
self.setCursor(QtCore.Qt.WaitCursor)
self.fileList.clear()
self.isDirectory.clear()
dirs = self.currentPath.split('/')
if len(dirs) > 1:
self.currentPath = ''
self.cdToParentButton.setEnabled(False)
self.ftp.cd('/')
else:
self.currentPath = '/'.join(dirs[:-1])
self.ftp.cd(self.currentPath)
self.ftp.list()
def updateDataTransferProgress(self, readBytes, totalBytes):
self.progressDialog.setMaximum(totalBytes)
self.progressDialog.setValue(readBytes)
def enableDownloadButton(self):
current = self.fileList.currentItem()
if current:
currentFile = current.text(0)
self.downloadButton.setEnabled(not self.isDirectory.get(currentFile))
else:
self.downloadButton.setEnabled(False)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
ftpWin = FtpWindow()
ftpWin.show()
sys.exit(ftpWin.exec_())
关于python - 使用 Python 创建 FTP 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1995046/
根据 FTP 协议(protocol)(rfc 959),当 ftp 客户端连接到 ftp 服务器时,应该在 ftp 客户端和 ftp 服务器之间建立控制连接。而当ftp客户端发送{LIST, R
是否可以使用 FTP 命令重命名 FTP 服务器上的文件夹? 我知道有一个用于文件重命名的 Rename 命令,但是我可以将它用于文件夹名称吗? 最佳答案 AFAIK,相同的命令( RNFR/RNTO
我有一个 ftp://host/path URL,我想下载文件并在 Erlang 中连接丢失时继续下载。 使用 ftp 开始下载非常简单模块,但如何恢复它? 最佳答案 是的..就像 Peer 提到的.
我一直在阅读 FTP 规范并使用 Wireshark 来捕获我的 FTP 客户端发送/接收的数据包,并有一些关于它们的问题。 首先是来自我的 FTP 服务器的“连接问候语”(如 FTP RFC 所称)
我有一个 ColdFusion 应用程序,用于在开发和生产服务器之间传输文件。实际发送文件的代码如下: ftp = new Ftp(); ftp.setUsername(username); ftp.
我正在尝试连接到允许匿名访问的 FTP 服务器,但我不知道如何指定执行此操作所需的适当用户名/密码。 我尝试过使用匿名/匿名作为用户/通行证,但没有成功,以及空字符串和两者的各种组合等。 这一定是我所
ftp rstatus $remotefile 在Solaris 上出现“?无效命令”错误。我发现,与 HP-UX 不同,Solaris 10 上没有像 rstatus 这样的 ftp 命令。基本上在
我是 Spring 的新手,我目前正在研究 spring 与 ftp 支持的集成。 我从本地目录传输到服务器 (filZilla)。 我从服务器下载了文件,没问题。 但我想知道如何将文件从 FTP 服
我想通过加密连接 FTP,需要使用 PHP 代码通过 TLS 隐式 FTP。 我已经尝试使用普通 FTP 进行加密,它可以工作,但加密需要通过 TLS 的隐式 FTP 不起作用。 最佳答案 尝试使用下
我已经成功使用 LuaSocket 的 TCP 工具,但我在使用它的 FTP 模块时遇到了问题。尝试检索(小)文件时,我总是超时。我可以在被动模式下使用 Firefox 或 ftp 下载文件(在 Ub
我尝试使用 putty 使用 FTP 详细信息主机名、用户名和密码登录到服务器。但是当我输入密码时它显示拒绝访问。 对于我的另一个网站,我输入了我的主机名并单击在腻子中打开,它显示“网络错误:连接超时
只是我,还是 FTP 看起来有点过时?它看起来很慢而且效率低下,而且它已经有 30 多年的历史了,并不是所有的旧东西都是坏的 :) 有哪些协议(protocol)可能成为 FTP 的继任者? 我用过一
我有一个有点相关但不同的问题 here . 我有一个批处理脚本( *.bat 文件),例如: @ftp -i -s:"%~f0"&GOTO:EOF open ftp.myhost.com myuser
我正在使用 IBM Mainframe TSO 从数据集中查看文件。最近有人告诉我每天开始将最新一代的数据集通过 FTP 传输到我桌面上的文件夹中。问题是我的 FTP 脚本只允许我用我输入的确切名称
我正在尝试使用 atom 包“Remote-FTP”和私钥连接到我的服务器。 我在我的服务器上设置了 SSH key ,并且可以使用腻子成功连接。 私钥保存在我的项目文件夹中,我有一个现有的 .ftp
我的 ftp 文件夹中有一组文件。我只能访问 ftp 模式。我想将那些扩展名为 .txt 的文件重命名为 .done 例如: 1.txt, 2.txt, 3.txt 到 1.done, 2.done,
lcd 更改本地目录。 ls 列出远程目录上的文件。 我想要的是lls,列出本地目录上的文件。 这可能吗? 我知道我总是可以打开另一个终端来执行此操作,但我很懒! 最佳答案 是的: !dir ! 告诉
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 社区去年审查
我的 FTP 测试服务器有问题。我已经安装并配置了 FileZilla 服务器,它正在监听端口 21 上的控制连接,然后它可以在 50100 和 51100 之间的端口上提供被动模式数据连接。 我正在
我正在运行 Filezilla Server 0.9.45 beta 来远程管理我的服务器。设置完成后,我测试使用 IP 127.0.0.1 连接到它,并且工作成功。但是,为了远程连接到服务器,我将端
我是一名优秀的程序员,十分优秀!