2017-03-04 105 views
-1

我剛寫了一些代碼:Python的 - 檢查用戶更改文件

hasher = hashlib.sha1() 
    inputFile = open(inputPath, 'r') 

    hasher.update(inputFile.read().encode('utf-8')) 
    oldHash = hasher.hexdigest() 
    newHash = '' 

    while True: 

     hasher.update(inputFile.read().encode('utf-8')) 
     newHash = hasher.hexdigest() 

     if newHash != oldHash: 
      print('xd') 

     oldHash = newHash 

我需要快速編寫SASS編譯器和如何我檢查,如果用戶在用戶file.It任何改變的作品,但只有當我添加一些文件,當我刪除任何字或字符它不檢測它。

你知道爲什麼嗎?

+0

請花費一些時間創建一個[mcve] – Idos

+0

您不能'read()'同一個文件兩次。你必須重新打開它。 –

回答

0

您可以使用os.path.getmtime(path)檢查上次修改時間,而不是立即檢查散列。

考慮:

in_path = "" # The sass/scss input file 
out_path = "" # The css output file 

然後檢查,如果該文件被簡單地改變做:

if not os.path.exists(out_path) or os.path.getmtime(in_path) > os.path.getmtime(out_path): 
    print("Modified") 
else: 
    print("Not Modified") 

您檢查過之後,如果該文件被修改,就可以檢查哈希:

import hashlib 

def hash_file(filename, block_size=2**20): 
    md5 = hashlib.md5() 
    with open(filename, "rb") as f: 
     while True: 
      data = f.read(block_size) 
      if not data: 
       break 
      md5.update(data) 
    return md5.digest() 

if not os.path.exists(out_path) or hash_file(in_path) != hash_file(out_path): 
    print("Modified") 
else: 
    print("Not Modified") 

總而言之,您可以將if語句合併爲:

if not os.path.exists(out_path) \ 
     or os.path.getmtime(in_path) > os.path.getmtime(out_path) \ 
     or hash_file(in_path) != hash_file(out_path): 
    print("Modified") 
else: 
    print("Not Modified") 
+0

非常感謝,這真的很有用:) –

+0

@KacperCzyż不客氣!如果它幫助解決你的問題,那麼隨時接受答案:) – Vallentin