2011-10-20 17 views
2

我的主要目标是在任何时候检查FTP服务器是否有新的文件命中,然后生成一个只包含新文件的.txt文件。如果没有新文件,则不返回任何内容。这是我到目前为止。我已经开始将文件从服务器复制到oldlist.txt,然后连接到FTP站点,并比较newlist.txt和oldlist.txt中的数据以及我在临时FTP文件changes.txt中所需的差异。每次连接时,我都会更改newlist.txt并将其设置为oldlist.txt,以便我可以在下次连接时进行比较。有一个更好的方法吗?我的列表似乎每次都不会更改数据。对不起,如果这是令人困惑的谢谢。使用FTP和列表进行Python编程

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

将列表转换为集合而不用担心排序会更容易/更快速。

for filename in set(newlist) - set(oldlist): 
    print 'New file: ', filename 

此外,而不是列表保存到一个文件作为原始文本,您可以使用搁置模块做出持久性存储是像一个普通的Python字典方便地访问。

否则,您的代码具有简单直接的优点。

这里有一个摸索出例如:

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() 
+0

所以你在说什么,而不是创建一个oldlist.txt文件,只是保存它的地方,我可以比较新的列表模块,然后输出我的更改到一个文件?对不起,如果这是不正确的,我很新。你能不能展示例子?非常感谢你的帮助!另外当我运行该代码时,你给了我它只是从ftp服务器向我显示整个列表。我只需要改变,如果有的话。 – user1005974

+0

谢谢你的例子raymond。我现在会尝试一下,看看它出现了什么。再次感谢你。 – user1005974

+0

Raymond你的代码似乎很好。但我将交换打印行代码,并将其复制到文本文件,以便我可以启动另一个进程。感谢您的帮助。 – user1005974

0

你实现这个计划是合理的。如果这是你正在做的事,我不会选择这个方案来实现自动化的FTP消息传递。这种方法有两个缺点:

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

一种方案是实际的服务器上的文件存储与一个保留名称,或在一个单独的场所,并且使用它的时间戳(优选的修改时间文件本身)来决定哪些文件可以安全处理。这个“信号量”文件作为上传文件的最后一步更新为当前时间。所有修改时间早于信号量时间戳的文件都可以被处理。一旦处理完毕,所有文件必须从上传文件夹中删除,这样它们不会被处理两次。我已经看到这种方案在自动化生产数据流中运行良好。

+0

wberry,谢谢你的回复。我对具有完全相同名称的文件没有任何问题,每次客户端向我们发送文件时,它都会在文件名中包含日期和时间戳。我不确定你的第二段是什么意思。我有种想法,但不知道如何实现与我的代码。非常感谢! – user1005974

+0

我的首选方法是实现部分文件消耗,实际上是将文件上传到临时文件夹,然后在上载后将它们移动到最终文件夹中。消费者然后可以处理它看到的任何文件,然后删除它们。但FTP服务器权限必须允许移动文件才能工作。 – wberry