Python - 文件夹更改时运行函数

时间:2018-05-15 07:25:48

标签: python if-statement monitoring

我想在我的文件夹中发生更改时运行我的函数。这里要做的主要是标准化新文件,我们这样做是通过比较我的两个文件夹,包含规范化文件夹的文件夹和我们添加新文件的文件夹,并返回我们的规范化函数将修改的不匹配文件的列表并放在标准化文件夹中。

这是我的代码

def normalize(c):
    PATH = path_to_file 
    fileNames = os.listdir(PATH)

    fileNames = c
    for file in fileNames:
        sfm = pd.read_csv(PATH + file, delimiter = ';', parse_dates=[[0, 1]], skiprows = 3)
  # other instructions then rewrite my new dataframe in my normalized folder
sfm.to_csv('.\dirnormalized'+str(file[:-4])+'.csv', sep=';', index=False, header=True)

def comparison():
    PATH = path_to_file 
    PATH_norm = path_to_norm
    fileNames = os.listdir(PATH)
    files = os.listdir(PATH_norm)
    fileNames = [file for file in fileNames if '.csv' in file]
    files = [fl for fl in files if '.csv' in fl]
    diff = [x for x in fileNames if x not in files]
    return diff

def change():

    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
# path_to_file and word_file are the same the only difference is that in path_to_file we have a back slash in the end in order to acces the files one by one 
    path = word_file
    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

def process(): 
    if(change()):
        c = comparison()
        normalize(c)
if __name__ == "__main__":
    import os 
    import time
    import logging
    from watchdog.observers import Observer
    from watchdog.events import LoggingEventHandler

    process()

这里唯一的问题是,在我的process()函数中,if()指令似乎没有传递给其他指令,我可以看到添加新文件的时间,这意味着修改发生但是其他说明不会发生在if()上。

2 个答案:

答案 0 :(得分:1)

process()的最后一行即observer.join()可能会阻止线程阻止函数返回。

此外,控制使函数返回None,导致if语句永远不会被执行。

答案 1 :(得分:0)

查看this以了解目录中的更改。

使用通过pywin32 win32file模块公开的MS ReadDirectoryChanges API。

我们在这里使用它的方式是在阻塞模式下使用调用ReadDirectoryChangesW。

该函数返回一个2元组列表,每个元组代表一个动作和一个文件名。重命名总是给出一对2元组;其他复合动作也可以给出一个列表。

<h1>-projects-</h1>
<ul id="button-container">
  <li>
    <a id="html-modal-button">
      <img class="htmllogo" src="https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/HTML5_Badge.svg/600px-HTML5_Badge.svg.png">
      <div class="html-text-block">
        <h2>HTML</h2>
        <p>My web projects</p>
      </div>
    </a>
  </li>
  <li>
    <a id="cs-modal-button">
      <img class="csharplogo" src="https://camo.githubusercontent.com/0617f4657fef12e8d16db45b8d73def73144b09f/68747470733a2f2f646576656c6f7065722e6665646f726170726f6a6563742e6f72672f7374617469632f6c6f676f2f6373686172702e706e67">
      <div class="cs-text-block">
        <h2>C#</h2>
        <p>My windows projects</p>
      </div>
    </a>
  </li>
</ul>

通过一些编辑,这可以很容易地实现你想要的,因为winApi被利用,它可能不那么容易出错。

谢谢Tim Golden。