【问题标题】:Change Y in a: For X in Y?在 a 中更改 Y:对于 Y 中的 X?
【发布时间】:2012-01-21 13:22:54
【问题描述】:

我正在尝试在 Python3.2 中制作一个连接到服务器并下载所有内容的 FTP 脚本。虽然它可以完美地处理文件,但目录似乎让事情有点麻烦。我已经做到了,所以当它遇到目录时,它会将变量目录设置为新目录并希望下载它的内容。它将排除已完成的项目,如果目录中的所有内容都已完成,它将返回目录直到完成。虽然代码似乎可以正常工作,但它不起作用。似乎我无法在 for 循环的会话中更改目录。这是代码: **注意一些变量稍后可能会被删除,只是想在这里得到一个粗略的草稿

import os, time, math, ftplib, zipfile, socket ## Just the regular imports... I guess

session = ftplib.FTP("CENSORED.info")
session.login(user="CENSORED",passwd="CENSORED")
dbpath = "/home/CENSORED/Dropbox/CENSORED"

debuglevel=0
session.set_debuglevel(debuglevel)

if session.getwelcome() != "":
        level = 1
    completed = []
    leveldir = {}
    currentdir = session.pwd()
    directory = session.nlst()
    reset = False
    print("CONNECTED")
    print("")

    while level != 0:
        if reset == False:
        level = 0
        reset = True

        try:
            print(directory)


            for file in directory:
                if file not in completed:
                   try:
                    print("Getting",file)
                    savefile = open(os.path.join(dbpath,file), 'wb')
                    session.retrbinary("RETR %s" % file, savefile.write) 
                    completed.append(file)

                   except ftplib.error_perm:
                    level += 1
                    leveldir[level] = currentdir
                    session.cwd(currentdir + file)
                    leveldir[level] = currentdir
                    directory = session.nlst()
                    print(leveldir,level)
                    print(file,"is a Directory! Attempting to enter...")
        if directory in completed:
            level -= 1
            session.cwd(leveldir[level])




    except IOError:
        print("Could Not obtain directory...")

else:
print("")
print("DISCONNECTED")


session.close()
print("")
print("DISCONNECTED")

**注意我不能保证间距是正确的,在 Stackoverflow 的帖子编辑器中很难分辨。对于一个关于编程的网站,我认为他们应该比他们更好地处理代码 sn-ps。

这是我在控制台中遇到的错误:

lib is a Directory! Attempting to enter...
Getting minecraft_server.jar
Traceback (most recent call last):
  File "CENSOREDftpbackup.py", line 34, in <module>
    session.retrbinary("RETR %s" % file, savefile.write) 
  File "/usr/local/lib/python3.2/ftplib.py", line 417, in retrbinary
    with self.transfercmd(cmd, rest) as conn:
  File "/usr/local/lib/python3.2/ftplib.py", line 379, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "/usr/local/lib/python3.2/ftplib.py", line 342, in ntransfercmd
    resp = self.sendcmd(cmd)
  File "/usr/local/lib/python3.2/ftplib.py", line 255, in sendcmd
    return self.getresp()
  File "/usr/local/lib/python3.2/ftplib.py", line 229, in getresp
    raise error_perm(resp)
ftplib.error_perm: 550 Can't open minecraft_server.jar: No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "CENSORED.py", line 40, in <module>
    session.cwd(currentdir + file)
  File "/usr/local/lib/python3.2/ftplib.py", line 556, in cwd
    return self.voidcmd(cmd)
  File "/usr/local/lib/python3.2/ftplib.py", line 260, in voidcmd
    return self.voidresp()
  File "/usr/local/lib/python3.2/ftplib.py", line 234, in voidresp
    resp = self.getresp()
  File "/usr/local/lib/python3.2/ftplib.py", line 229, in getresp
    raise error_perm(resp)
ftplib.error_perm: 550 Can't change directory to /minecraft_server.jar: Not a directory

谢谢!

【问题讨论】:

  • 复制和粘贴应该适合您。无论如何,应该有一些适合您首选的网络浏览器的插件,让事情变得更容易。在 Firefox 中,我使用It's All Text!

标签: python variables for-loop


【解决方案1】:

不,您通常不能更改您正在迭代的内容,因为 Python 在 for 循环中执行的幕后工作不会在您重新绑定变量时得到更新。

在 ftp 服务器上递归遍历目录树是 solved problem;你可以使用ftplib

【讨论】:

  • 好吧,我不完全明白它是如何解决的,然后说我可以使用 ftplib。我有点需要坚持使用默认库,但感谢有关 for 循环的答案!
  • 对不起。我的观点是你不应该编写这段代码,因为其他人已经完成了。我认为@nickd 的回答很简洁。
【解决方案2】:

我认为你应该使用递归。我不太了解python,无法向您展示它应该是什么样子,但这里有一些伪代码

startFolder = '/home/nick'

processFolder(startFolder)

def processFolder(folder)
    session.changedir(folder)
    for entry in folder
        if entry isa directory
            processFolder(entry)
        else
            processFile(entry)
    session.changedir('..')

processFile 方法应该执行复制或其他操作。

我希望这很清楚。

【讨论】:

  • 哦,这是个好主意。我会尝试一下,但我仍然想知道是否可以在 for 循环运行时更改变量。希望精通 Python 的人也可以发表评论。谢谢尼克!
  • 哦,我想我知道为什么我不能这样做了。我判断它是否是目录的方法是它是否返回错误 550,而我只有在尝试下载文件后才会得到它。也许我可以打破它?谢谢@nickd
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
相关资源
最近更新 更多