1

请多多包涵。我开始使用 python 才一周。继承人的问题:我想连接到 FTP 服务器。假设我的 ftp 和本地目录上的文件结构是相同的。我希望我的 python 程序执行以下操作:

1> 在运行程序时,它应该上传所有不在服务器上但在我本地的文件(只上传丢失的文件 - 不替换所有文件)。说,我添加了一个新目录或一个新文件,它应该按原样上传到服务器上。2> 然后它应该检查本地和服务器上文件的修改时间,并告知哪个是最新的。

现在,我制作了两个程序:

1>一个程序,将所有文件从本地上传到服务器,原样。我宁愿它检查丢失的文件,然后只加载丢失的文件夹。不是全部替换。2> 第二个程序将列出本地的所有文件,使用 os.walk 并将所有文件上传到服务器上,而不创建正确的目录结构。全部复制到服务器的根目录。然后它还会检查修改时间。

我现在正试图将这两个模块连接成一个完美的,可以满足我的所有需求。任何能够真正查看这些代码并尝试将它们加入我想要做的事情的人,都会是完美的。对不起,这么痛苦!!

PS:我可能没有以简单的方式完成所有事情!

代码 1:

import sys

from ftplib import FTP

import os

def uploadDir(localdir,ftp):

    """

    for each directory in an entire tree

    upload simple files, recur into subdirectories

    """

    localfiles = os.listdir(localdir)

    for localname in localfiles:

        localpath = os.path.join(localdir, localname)


        print ('uploading', localpath, 'to', localname)
        if not os.path.isdir(localpath):

            os.chdir(localdir)


            ftp.storbinary('STOR '+localname, open(localname, 'rb'))



        else:

            try:

                ftp.mkd(localname)

                print ('directory created')

            except:

                print ('directory not created')

            ftp.cwd(localname)             # change remote dir

            uploadDir(localpath,ftp)                  # upload local subdir

            ftp.cwd('..')                  # change back up

            print ('directory exited')


def Connect(path):
  ftp = FTP("127.0.0.1")
  print ('Logging in.')
  ftp.login('User', 'Pass')
  uploadDir(path,ftp)


Connect("C:\\temp\\NVIDIA\\Test")

代码 2:

import os,pytz,smtplib
import time
from ftplib import FTP
from datetime import datetime,timedelta
from email.mime.text import MIMEText



def Connect_FTP(fileName,pathToFile):                       path from the local path
(dir,file) = os.path.split(fileName)

fo = open("D:\log.txt", "a+")                        # LOgging Important Events
os.chdir(dir)
ftp = FTP("127.0.0.1")
print ('Logging in.')
ftp.login('User', 'Pass')
l=dir.split(pathToFile)
print(l[1])

if file in ftp.nlst():                                          
print("file2Check:"+file)
    fo.write(str(datetime.now())+":  File is in the Server. Checking the Versions....\n")
    Check_Latest(file,fileName,ftp,fo)
else:
    print("File is not on the Server. So it is being uploaded!!!")
    fo.write(str(datetime.now())+":  File is NOT in the Server. It is being Uploaded NOW\n")
    ftp.storbinary('STOR '+file, open(file, 'rb'))


print("The End")


def Check_Latest(file2,path_on_local,ftp,fo):                               # Function to check the latest file, USING the "MOdified TIme"
LOcalFile = os.path.getmtime(path_on_local)
dloc=datetime.fromtimestamp(LOcalFile).strftime("%d %m %Y %H:%M:%S")
print("Local File:"+dloc)
localTimestamp=str(time.mktime(datetime.strptime(dloc, "%d %m %Y %H:%M:%S").timetuple())) # Timestamp to compare LOcalTime


modifiedTime = ftp.sendcmd('MDTM '+file2)                             # Using MDTM command to get the MOdified time.
IST = pytz.timezone('Asia/Kolkata')
ServTime=datetime.strptime(modifiedTime[4:], "%Y%m%d%H%M%S")

tz = pytz.timezone("UTC")
ServTime = tz.localize(ServTime)
j=str(ServTime.astimezone(IST))                                       # Changing TimeZone
g=datetime.strptime(j[:-6],"%Y-%m-%d %H:%M:%S")
ServerTime = g.strftime('%d %m %Y %H:%M:%S')
serverTimestamp=str(time.mktime(datetime.strptime(ServerTime, "%d %m %Y %H:%M:%S").timetuple())) # Timestamp to compare Servertime

print("ServerFile:"+ServerTime)

if serverTimestamp > localTimestamp:
  print ("Old Version on The Client. You need to update your copy of the file")
  fo.write(str(datetime.now())+":  Old Version of the file "+file2+" on the Client\n")
  return
else:
  print ("The File on the Server is Outdated!!!New COpy Uploaded")
  fo.write(str(datetime.now())+": The server has an outdated file: "+file2+". An email is being generated\n")
  ftp.storbinary('STOR '+file2, open(file2, 'rb'))

def Connect(pathToFile):

for path, subdirs, files in os.walk(pathToFile):
 for name in files:
    j=os.path.join(path, name)
    print(j)
    Connect_FTP(j,pathToFile)

Connect("C:\temp\NVIDIA\Test")

4

1 回答 1

0

可能这个脚本会有用。

于 2013-02-20T07:17:26.707 回答