2017-02-10 64 views
1

我有一个工具,每天晚上11点将新文件添加到Unix服务器文件夹中。 我想编写一个python脚本,将于晚上11点30分发布,它会在这个文件夹中找到新文件,删除的文件和修改后的文件。 这些文件具有唯一的名称“123456_0.csv,123456_1.csv”。 由于脚本将手动启动,因此我不想使用繁忙的等待模式。 我只想使用python库。如何用python 3.x在一个文件夹中找到新的/已更改/已删除的文件

谢谢。

在以下几行我的代码(我是新来的Python):

def F_CreateArchive(Time_stamp, Added_Filename, Aux_Filename, Field_Names, File_Extension): 
     if not os.path.exists(Added_Filename): 
      with open(Added_Filename, 'w', newline='') as arch: 
       archive_write = csv.DictWriter(arch, fieldnames=Field_Names, delimiter=';') 
       archive_write.writeheader() 
       folder_files = glob.glob(File_Extension) 
       for each_folder_file in folder_files: 
        md5file = hashlib.md5(open(each_folder_file,'rb').read()).hexdigest() 
        archive_write.writerow({'TIMESTAMP': Time_stamp, 'FILENAME': each_folder_file, 'ACTION': 'added', 'MD5': md5file}) 
     return 0 
    def F_CheckAdded(Time_stamp, Added_Filename, Aux_Filename, Field_Names, File_Extension): 
     dict_added_archive = {} 
     dict_folder_file = {} 
     folder_files = glob.glob(file_extension) 
     for each_file in folder_files: 
      with open(each_file, 'rb') as file: 
       dict_folder_file[each_file] = hashlib.md5(file.read()).hexdigest() 

     with open(Added_Filename, 'r') as addfile: 
      added_read = csv.DictReader(addfile, delimiter=";") 
      for row in added_read: 
       if(row['FILENAME'] != ''): 
        dict_added_archive[row['FILENAME']] = row['MD5'] 
      addfile.seek(0) 

     print(dict_folder_file) 
     print(dict_added_archive) 

     with open(Aux_Filename, 'w', newline='') as aux, open(Added_Filename, 'r') as addfile: 
      added_read = csv.DictReader(addfile, delimiter=";") 
      aux_write = csv.DictWriter(aux, fieldnames=Field_Names, delimiter=';') 
      aux_write.writeheader() 
      for filename_folder, md5_folder in dict_folder_file.items(): 
       if filename_folder in dict_added_archive and md5_folder == dict_added_archive[filename_folder]: 
        print('The file %s hasn\'t been changed.' %filename_folder) 
        for row in added_read: 
         if(row['FILENAME'] == filename_folder): 
          aux_write.writerow(row) 
        addfile.seek(0) 

       elif filename_folder in dict_added_archive and md5_folder != dict_added_archive[filename_folder]: 
        print('The file %s has been modified.' %filename_folder) 
        aux_write.writerow({'TIMESTAMP': Time_stamp, 'FILENAME': filename_folder, 'ACTION': 'added', 'MD5': md5_folder}) 

       elif filename_folder not in dict_added_archive: 
        print('The file %s is new.' %filename_folder) 
        aux_write.writerow({'TIMESTAMP': Time_stamp, 'FILENAME': filename_folder, 'ACTION': 'added', 'MD5': md5_folder}) 

      for filename_archive, md5_archive in dict_added_archive.items(): 
       if filename_archive not in dict_folder_file: 
        print('The file %s has been removed.' %filename_folder) 
        aux_write.writerow({'TIMESTAMP': Time_stamp, 'FILENAME': filename_archive, 'ACTION': 'removed', 'MD5': md5_archive}) 
+2

看起来你要我们写一些代码给你。尽管许多用户愿意为遇险的编码人员编写代码,但他们通常只在海报已尝试自行解决问题时才提供帮助。证明这一努力的一个好方法是包含迄今为止编写的代码,示例输入(如果有的话),期望的输出以及实际获得的输出(控制台输出,回溯等)。您提供的细节越多,您可能会收到的答案就越多。检查[FAQ]和[问]。 – MooingRawr

+1

UNIX有哪些风味?在Linux上,你可以使用'pynotify':https://pypi.python.org/pypi/py-notify/0.3.1 – cdarke

+0

我想避免pynotify。 – Rozmol

回答

1
  • 查找被删除的文件?

    • 您可以跟踪文件的名称为pickle或在文本文件,并做了差异与当前可用的文件
  • 寻找新的文件?

    • 同上
    • 检查os.stat(路径):st_ctime,上的所有文件
  • 找到修改的文件?
    • 检查os.stat(路径):st_mtime,上的所有文件
+0

我不能使用泡菜。任何其他选项?谢谢。 – Rozmol

+0

将文件名存储在文件 –

+0

@Rozmol如果它符合您的要求,您可以接受该答案 –

相关问题