автоматическая загрузка файлов из ftp с использованием python и предотвращение загрузки файлов более одного раза - PullRequest
0 голосов
/ 02 ноября 2019

У нас есть папка ftp, которая содержит более 700 файлов (автоматически генерируемых из нашей системы) с именем файла, например: ff9a6c2b-4222-4464-a314-dce56efe76cb.txt .. ffbaef37-9d73-41d5-8f23-7ca7c82b3969.txt .. fffa92f0-9e76-4cce-8933-d256bac90ffa.txt Я пытаюсь написать скрипт для автоматической загрузки файлови для предотвращения загрузки файлов более одного раза, моя идея состоит в том, чтобы сохранить все загруженные имена файлов в XML-файле (это работало хорошо) и проверить, существует ли имя в XML-файле перед загрузкой.

Проблема даже в том случае, если естьЭто 8 новых файлов, которые он загружает только один.

Мой код

import ftputil 
from subprocess import Popen 
import ftplib
import os
import os.path
import xml.etree.cElementTree as ET



server = 'ip_adress'
user = 'user'
password = 'Passwd'


ftp = ftplib.FTP(server)
ftp.login(user, password)

files = []
root = ET.Element("files")

file_exists = os.path.isfile("filename.xml") 

if file_exists:
   f = ET.parse("filename-Copie.xml")
   root = f.getroot()
   files = ftp.nlst()
   for file in files:
       for item in root:
           if file != item.text :
               #print ("the file name: ",item.text, " already exist")  
                ftp_host = ftputil.FTPHost(server, user, password)
                ftp_host.download(file, file)
                ET.SubElement(root, "file", name="filename").text = file

   tree = ET.ElementTree(root)
   tree.write("filename.xml")
   p = Popen("move.bat", cwd=r"C:\\Users\\Sas\\Desktop\\ftpdown\\") 
   stdout, stderr = p.communicate()
   print("Finished!") 

else:
   f = open("filename.xml", "w")
   with ftputil.FTPHost(server, user, password) as ftp_host: 

        files = ftp_host.listdir(ftp_host.curdir)
        root = ET.Element("files")
        for file in files:
            if ftp_host.path.isfile(file):
               ftp_host.download(file, file)
               ET.SubElement(root, "file", name="filename").text = file
   tree = ET.ElementTree(root)
   tree.write("filename.xml")
   p = Popen("move.bat", cwd=r"C:\\Users\\Sas\\Desktop\\ftpdown\\") 

   stdout, stderr = p.communicate() 
print("Finished!") 


1 Ответ

0 голосов
/ 02 ноября 2019

Я решил проблему, сохранив имя файла, извлеченное из xml, в список, приведенный ниже, если у кого-то есть такая же проблема, как у меня


import ftputil 
from subprocess import Popen 
import ftplib
import os
import os.path
import xml.etree.cElementTree as ET



server = 'ip-adress'
user = 'user'
password = 'Passwd'


ftp = ftplib.FTP(server)
ftp.login(user, password)

files = []
root = ET.Element("files")

file_exists = os.path.isfile("filename.xml") 

if file_exists:
   f = ET.parse("filename-Copie.xml")
   root = f.getroot()
   files = ftp.nlst()
   oldfile = []
   for child in root:
       oldfile.append(child.text)

   for file in files:
           if file not in oldfile: 
                ftp_host = ftputil.FTPHost(server, user, password)
                ftp_host.download(file, file)
                ET.SubElement(root, "file", name="filename").text = file

   tree = ET.ElementTree(root)
   tree.write("filename.xml")
   p = Popen("move.bat", cwd=r"C:\\Users\\Sas\\Desktop\\ftpdown\\") 
   stdout, stderr = p.communicate()
   print("Finished!") 

else:
   f = open("filename.xml", "w")
   with ftputil.FTPHost(server, user, password) as ftp_host: 

        files = ftp_host.listdir(ftp_host.curdir)
        root = ET.Element("files")
        for file in files:
            if ftp_host.path.isfile(file):
               ftp_host.download(file, file)
               ET.SubElement(root, "file", name="filename").text = file
   tree = ET.ElementTree(root)
   tree.write("filename.xml")
   p = Popen("move.bat", cwd=r"C:\\Users\\Sas\\Desktop\\ftpdown\\") 

   stdout, stderr = p.communicate() 
print("Finished!") 


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