2017-11-01 1 views
1

Wir verwenden CKEditor, um HTML-Inhalt zu generieren, wenn der Autor sein Buch schreibt. Wir speichern diesen Inhalt mit python-django in einer separaten HTML-Datei auf der Festplatte.Python - Datei- oder Ordnerinhalt Versionskontrolle

Aber jetzt haben wir eine Anforderung von Kunden zu zeigen die Geschichte/Revision der Dateien (Liste des Zeitstempels in einer Seitenleiste, wenn Autor ctrl+s gedrückt) bekamen, wie das Eclipse tut:

enter image description here

Ich plane, Diff zu verwenden, indem ich Schnittpunkt der HTML-Texte nehme, die zu 2 verschiedenen Zeiten gespeichert werden.

Aber ich habe keine Ahnung, wie man die Unterschiede von Bildern, Audios und Videos nimmt.

Irgendeine Idee, wie Git, Eclipse oder Vesrsion Kontrollsysteme das tun? Verwenden sie irgendeine Art von Codierung wie SHA, um sie auf der Festplatte zu speichern?

Bitte schlagen Sie vor, wenn Sie eine andere Methode verwenden, um dies zu tun.

Ich bin bereit zu verwenden, wenn eine Open-Source-Python-Lib verfügbar ist. Ich habe gegoogelt, aber kein Glück.

+0

Also, im Wesentlichen, willst du git neu implementieren? – DeepSpace

+0

@DeepSpace Sortieren von, aber wir müssen es nur für eine Benutzersitzung speichern, wie für maximal 4-6 Stunden und nur für eine HTML-Datei. aber Sie wissen, dass HTML-Dateien Bilder, Audio, Video usw. darin enthalten können. – Laxmikant

+1

Ich glaube nicht, Git kann diff Binärdateien. Es kann nur * prüfen * wenn die Datei geändert wurde oder nicht. Zum Vergleichen von Dateien in Python siehe das Modul [filecmp] (https://docs.python.org/2/library/filecmp.html). – xyres

Antwort

2

Try This (i schrieb eine Klasse für Sie):

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") 

HINWEIS: so können Sie fragen; Wenn ich meine Dateiadresse habe, warum brauche ich die Unterfunktion get_file_full_path() ?, weil Sie eine dynamische Adresse wie "./myfile" und "get_file_full_path()" in diese Klasse einfügen können.

+0

Super, vielen Dank ...! +1 für 'get_file_full_path' – Laxmikant

Verwandte Themen