получить только 5 файлов, а затем 5 файлов в следующем сеансе - PullRequest
0 голосов
/ 16 мая 2018

У меня как 2000 файлов внутри папки на файловом сервере. Я использую paramiko для SFTP этих файлов. Все работает нормально.

Теперь я планирую выбрать первые 100 файлов, а затем следующий лот. Любые предложения о том, как я могу сделать это через paramiko.

Итак, теперь у меня есть добавленный код. Логика в том, что я успешно перемещаю файлы между моим сервером и рабочим столом. единственное, что мне нужно сделать, это добавить пакетную обработку файлов.

import os
from stat import S_ISDIR

import paramiko
import tika
from tika import parser
tika.initVM()

paramiko.util.log_to_file('D:/Paramiko/logs/paramiko.log')

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('xxxx', username='ubuntu', password='', key_filename='D:/Paramiko/test.pem')
sftp = ssh.open_sftp()

depth=2
stdin, stdout, stderr = ssh.exec_command("find . -mindepth "+str(depth)+" -maxdepth "+str(depth)+" -type d ")
dlist = list(stdout.readlines())
len = (len(dlist))


def getfiles_from_directory(subfolder,filename,sftp,local_p):
    remote_path = subfolder+'/'+filename
    local_path = os.path.join(local_p,filename)
    #print('R:'+remote_path+'L:'+local_path)
    sftp.get(remote_path,local_path)
    try:
        parsed = parser.from_file(local_path)
        print('MetaData:'+str(parsed['metadata']))
    except KeyError as k:
        print(k)



folders_copied = []
files_copied = []
for direc in dlist:
        direcname = str(direc).replace('./', '')
        #print(direcname)
        if not direcname.startswith('.'):
            local_path = 'D:/Paramiko/Test' #make sure this path exists i.e Test folder inside Paramiko is made prior to execution of this line
            for i in range(depth):
                stdin, stdout, stderr = ssh.exec_command("cd "+direcname+" pwd")
                subfolder = stdout.readlines()
                #print("Query Result:"+str(subfolder))
                subfolder = str(subfolder[0]).strip()
                local_p = os.path.join(local_path,direcname.strip())
                if os.path.exists(local_p)==False:
                    os.mkdir(local_p)
                sftp.chdir(subfolder)
                children = sftp.listdir()
                # stdin, stdout, stderr = ssh.exec_command("ls")
                # subfolder_content = list(stdout.readlines())
                #getfiles_from_directory(sftp,subfolder)
                for content in children:
                    content_sub = str(content)
                    if content_sub.endswith('\n')==False and content_sub.__contains__('.'):
                        print('Found a file:'+content_sub)
                        if subfolder not in folders_copied:
                            getfiles_from_directory(subfolder,content_sub,sftp,local_p)
                            files_copied.append(subfolder+'/'+content_sub)
                    else:
                        print('Found a folder:'+content_sub)
                folders_copied.append(subfolder)
print('Folders Copied:'+str(folders_copied))
print('Files Copied:'+str(files_copied))

1 Ответ

0 голосов
/ 30 мая 2018

Решил это. Использование os.walk над корневой папкой. Вычисление глубины 1-й папки и ее повторение.

Простая логика глубины.

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