2017-11-01 7 views
1

著者は自分の書籍を書くときにHTMLコンテンツを生成するためにCKEditorを使用しています。私たちはpython-djangoを使ってそのコンテンツをディスク上の別々のHTMLファイルに保存しています。Python - ファイルまたはフォルダのコンテンツバージョンコントロール

しかし、Eclipseがないように、今、私たちは、ファイルの履歴/リビジョンを表示するには、クライアントからの要求(著者はctrl+sを押した時はいつでも、サイドバーのタイムスタンプのリスト)を持っている:

enter image description here

私は2つの異なる時に格納されたhtmlテキストの交差点を取ってdiffを使うつもりです。

しかし、私は画像、オーディオ、ビデオのdiffを取る方法については何も考えていません。

どのようにgit、eclipse、Vesrsionの制御システムがそれをするのでしょうか? SHAなどのあらゆる種類のエンコーディングを使用してディスクに格納しますか?

これを行うために使用できる他の方法があるかどうかをご提案ください。

オープンソースのPythonのlibがあれば使用できます。私はグーグルで運がない。

+0

本質的に、gitを再実装しようとしていますか? – DeepSpace

+0

@DeepSpace一種ですが、ユーザーセッション用に保存する必要があるのは、最大4-6時間、1つのHTMLファイルのみです。 HTMLファイルには画像、音声、ビデオなどがリンクされている可能性があります。 – Laxmikant

+1

私はgitがバイナリファイルを比較できるとは思わない。ファイルが変更されているかどうかチェックすることしかできません。 Pythonでファイルを比較するには、[filecmp](https://docs.python.org/2/library/filecmp.html)モジュールを参照してください。 – xyres

答えて

2

これを試してみてください(私はあなたのためのクラスを書いた):

import os 
import time 
import hashlib 


class SimpleFileCheckSum(object): 

    def __init__(self, path): 

     self.path = path 
     self.output = {} 

    def check_path_error(self): 

     if os.path.exists(self.path) is True and os.path.isfile(self.path): 
      return True 
     else: 
      return False 

    def get_file_size(self): 

     try: 
      st_data = os.stat(self.path) 
      get_size = str(st_data.st_size) 

     except PermissionError: 

      try: 

       os_size_data = str(os.path.getsize(self.path)) 
       self.output["SIZE"] = os_size_data 

      except: 
       self.output["SIZE"] = "Error" 

     else: 
      self.output["SIZE"] = get_size 

    def get_file_times(self): 

     def convert_time_to_human_readable(get_time): 

      return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(get_time)) 

     try: 

      my_st_object = os.stat(self.path) 

      file_creation_time = convert_time_to_human_readable(my_st_object.st_ctime) 
      file_last_modified_time = convert_time_to_human_readable(my_st_object.st_mtime) 

     except: 
      self.output['TIMES'] = {"CREATION": "Error", "MODIFIED": "Error"} 

     else: 
      self.output['TIMES'] = {"CREATION": file_creation_time, "MODIFIED": file_last_modified_time} 

    def get_file_full_path(self): 

     try: 

      get_full_path = os.path._getfullpathname(self.path) 
      get_final_path = os.path._getfinalpathname(self.path) 

     except: 
      self.output['PATH'] = {"FULL": "Error", "FINAL": "Error"} 

     else: 
      self.output['PATH'] = {"FULL": get_full_path, "FINAL": get_final_path} 

    def get_file_hashes(self): 

     try: 

      hash_md5 = hashlib.md5() 
      hash_sha1 = hashlib.sha1() 
      hash_sha256 = hashlib.sha256() 
      hash_sha512 = hashlib.sha512() 

      with open(self.path, "rb") as f: 
       for chunk in iter(lambda: f.read(2 ** 20), b""): 
        hash_md5.update(chunk) 
        hash_sha1.update(chunk) 
        hash_sha256.update(chunk) 
        hash_sha512.update(chunk) 

     except: 
      self.output["HASH"] = {"MD5": "Error", "SHA1": "Error", "SHA256": "Error", "SHA512": "Error"} 

     else: 
      self.output["HASH"] = {"MD5": hash_md5.hexdigest(), "SHA1": hash_sha1.hexdigest(), 
            "SHA256": hash_sha256.hexdigest(), "SHA512": hash_sha512.hexdigest()} 

    def call_all(self): 

     if self.check_path_error() is True: 

      self.get_file_full_path() 
      self.get_file_size() 
      self.get_file_times() 
      self.get_file_hashes() 

      return self.output 

     else: 
      return {"Error": "Your Path is Not Valid"} 


if __name__ == '__main__': 

    file_info = SimpleFileCheckSum("Your_file_address") 
    get_last_data = file_info.call_all() 

    print("Your Raw Dict Output : ", get_last_data, "\n\n") 

注:はそうあなたが求めることができます。私のファイルアドレスを持っている場合、なぜ私はget_file_full_path()サブ関数?が必要です... "./myfile"のようなこのクラスに動的アドレスを入れることができ、get_file_full_path()は完全なアドレスと最終アドレスを返します。

+0

恐ろしい、多くのありがとう...! 'get_file_full_path'の+1 – Laxmikant

関連する問題