使用FTP和列表进行Python编程

时间:2011-10-20 20:17:26

标签: python ftp

我的主要目标是随时检查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")

2 个答案:

答案 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消息传递,如果这就是你正在做的事情。这种方法有两个缺点:

  • 它不支持重复的文件名。 “旧”历史记录中出现的任何文件名都不会被检测为新文件。也许这对你来说是个问题,也许不是。但即使文件名现在保证唯一,也可能并非总是如此。
  • 它不会告诉您是否准备好使用新文件。在上传文件时,可能会处理新文件。有些人应用“X秒大小没有变化”的规则,但这只会增加延迟,并且仍然会对断开的连接造成漏洞。

一个类似但没有这两个问题的方案是实际将文件存储在具有保留名称的服务器上,或者在一个单独的位置,并使用其时间戳(最好是文件本身的修改时间) )决定哪些文件可以安全处理。此“信号量”文件将更新为当前时间,作为上载文件的最后一步。可以处理修改时间早于信号量时间戳的所有文件。处理完毕后,必须从上传文件夹中删除所有文件,这样才能处理两次。我已经看到这种方案在自动化生产数据流中运行良好。