我的主要目标是随时检查FTP服务器是否有新文件命中,然后生成.txt文件,其中只复制了新文件。如果没有新文件,则不返回任何内容。这是我到目前为止所拥有的。我已经开始将文件从服务器复制到oldlist.txt,然后连接到FTP站点并比较来自newlist.txt和oldlist.txt的数据以及我想要的临时FTP文件changes.txt中的差异。每次我连接时,我都会更改newlist.txt并将其设为oldlist.txt,这样我就可以在下次连接时进行比较。有一个更好的方法吗?我的列表似乎每次都不会更改数据。对不起,如果这是令人困惑的谢谢。
import os
filename = "oldlist.txt"
testing = "newlist.txt"
tempfilename = "Temporary FTP file Changes.txt"
old = open(filename, "r")
oldlist = old.readlines()
oldlist.sort()
from ftplib import FTP
ftp = FTP("ftpsite", "username", "password")
ftp.set_pasv(False)
newlist = []
ftp.dir(newlist.append)
newlist.sort()
ftp.close()
bob = open(testing, "w")
for nl in newlist:
bob.write(nl + "\n")
hello = open(tempfilename, "w")
for c in newlist:
if c not in oldlist:
hello.write(c + "\n")
bob.close()
old.close()
hello.close()
os.remove("oldlist.txt")
os.rename("newlist.txt", "oldlist.txt")
答案 0 :(得分:3)
将列表转换为集合更容易/更快,而不用担心排序。
for filename in set(newlist) - set(oldlist):
print 'New file: ', filename
此外,您可以使用shelve模块创建一个可以像普通Python dict一样方便地访问的持久存储,而不是将列表保存为原始文本。
否则,您的代码具有简单直接的优点。
这是一个成功的例子:
from ftplib import FTP
import shelve
olddir = shelve.open('filelist.shl') # create a persistent dictionary
ftp = FTP('ftp1.freebsd.org')
ftp.login()
result = []
ftp.dir(result.append)
newdir = set(result[1:])
print ' New Files '.center(50, '=')
for line in sorted(set(newdir) - set(olddir)):
print line
olddir[line] = ''
print ' Done '.center(50, '=')
olddir.close()
答案 1 :(得分:0)
您实施此计划是合理的。我不会选择这种方案来实现自动FTP消息传递,如果这就是你正在做的事情。这种方法有两个缺点:
一个类似但没有这两个问题的方案是实际将文件存储在具有保留名称的服务器上,或者在一个单独的位置,并使用其时间戳(最好是文件本身的修改时间) )决定哪些文件可以安全处理。此“信号量”文件将更新为当前时间,作为上载文件的最后一步。可以处理修改时间早于信号量时间戳的所有文件。处理完毕后,必须从上传文件夹中删除所有文件,这样才能处理两次。我已经看到这种方案在自动化生产数据流中运行良好。