Изменить Y в: Для X в Y? - PullRequest
       8

Изменить Y в: Для X в Y?

0 голосов
/ 21 января 2012

Я пытаюсь создать сценарий FTP на Python3.2, который подключается к серверу и загружает все содержимое. Несмотря на то, что он прекрасно обрабатывает файлы, каталоги, кажется, немного беспокоят. Я сделал это так, что когда он встретит каталог, он установит каталог переменных в новый каталог и, надеюсь, загрузит его содержимое. Он исключит элементы, уже выполненные, и если все содержимое в каталоге находится в завершенном, он будет находиться в задней части каталога до его завершения. Хотя кажется, что код будет работать, это не так. Кажется, я не могу изменить каталог в середине сеанса цикла 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. Для веб-сайта о программировании я думаю, что они должны обрабатывать фрагменты кода намного лучше, чем они.

Вот ошибка, которую я получаю в консоли:

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 января 2012

Нет, вы вообще не можете изменить то, что вы повторяете, потому что есть закулисная работа, которую выполняет Python в цикле for, который не обновляется при повторном связывании переменной.

Рекурсивная прогулка по дереву каталогов на ftp-сервере - это решенная проблема ; Вы можете использовать ftplib.

2 голосов
/ 21 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...