Python-文件或文件夹内容版本控制
当作者写书时,我们使用CKEditor生成HTML内容。我们使用PythonDjango将这些内容存储到磁盘上一个单独的HTML文件中 但是现在,客户要求我们显示文件的历史记录/版本(每当作者按下Python-文件或文件夹内容版本控制,python,django,version-control,Python,Django,Version Control,当作者写书时,我们使用CKEditor生成HTML内容。我们使用PythonDjango将这些内容存储到磁盘上一个单独的HTML文件中 但是现在,客户要求我们显示文件的历史记录/版本(每当作者按下ctrl+s时,边栏中的时间戳列表),就像Eclipse一样: 我计划使用diff,将存储在两个不同时间的html文本进行交集 但我不知道如何区分图像、音频和视频 你知道git、eclipse或Version控制系统是如何做到这一点的吗? 他们是否使用诸如SHA之类的编码将其存储在磁盘上 请建议我是否
ctrl+s
时,边栏中的时间戳列表),就像Eclipse一样:
我计划使用diff,将存储在两个不同时间的html文本进行交集
但我不知道如何区分图像、音频和视频
你知道git、eclipse或Version控制系统是如何做到这一点的吗?
他们是否使用诸如SHA之类的编码将其存储在磁盘上
请建议我是否可以使用任何其他方法来完成此操作
如果有任何开源python库可用,我已经准备好使用。我用谷歌搜索,但运气不佳。试试这个(我为你写了一个课程):
注意:所以你可以问;如果我有我的文件地址,为什么我需要get_file_full_path()子函数?。。。因为你可以给这个类添加一个动态地址,比如“/myfile”和get\u file\u full\u path()将重新返回它的完整地址和最终地址。那么,本质上,你是想重新实现git吗?@DeepSpace,但我们必须为一个用户会话存储它,就像可能最多4-6小时,并且只为一个HTML文件存储一样。但你知道HTML文件可能包含图像、音频、视频等链接,我认为git无法区分二进制文件。它只能检查文件是否已更改。有关在Python中比较文件的信息,请参阅模块。@Laxmikant:是否保存文件校验和?SHA不是编码!!这是一个杂烩!您不能将哈希值反转为其原始数据!我可以为你写。。您是指文件校验和(然后您可以将它们一起比较,校验和:创建时间、修改时间、文件散列、大小、路径等)?或者…?太棒了,非常感谢+1用于
get\u file\u full\u path
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")