【问题标题】:Validate document file extension python验证文档文件扩展名 python
【发布时间】:2020-12-31 18:40:00
【问题描述】:

我正在使用 Python 3,我需要验证文档文件(例如 .pdf.xlsx.docx)我像二进制一样通过请求获得。我目前正在使用一个小函数来获取扩展的 hexa,但它仅适用于 .pdf

看起来像这样:

def validate_binary_extension(self, file):
        extension = file[0:3].hex()
        extencions = ['255044', 'D0CF11', "D0CF11"]
        if  extension in extencions:
            return True
        else: 
            return False

我阅读了 .doc.exe 的 hexa,但我不知道如何获取这些类型文档的扩展名。

【问题讨论】:

  • 旁注:最后四行应该直接替换为return extension in extencions;当测试本身已经产生True/False时,测试并返回True/False是愚蠢的。
  • 什么是“扩展的hexa”?
  • @mkrieger1 是的,但我看到 docx 和 exe 已经结束了
  • @ShadowRanger 当我运行单元测试时获得前六个六进制并且不匹配返回 false
  • @alejandrocorrea:我不明白你的最后评论。我想你是在告诉我关于我上一条评论的一些内容对你没有用,但我完全不确定,更不用说我可以解决什么问题了。

标签: python


【解决方案1】:

一个明显的问题是.hex() 返回小写 十六进制,而您提供了大写十六进制常量。第一个可以工作,因为十六进制是纯数字,但如果你想让 'D0CF11'bytes.hex() 的输出匹配,'D0CF11' 应该是 'd0cf11'

【讨论】:

  • 要清楚,这些十六进制常量都没有对应于您列出的文件扩展名,但我假设您有一些奇怪的二进制系统,它不是真正的文件 extension我>。滥用.hex()的返回至少是一个明显的逻辑问题。
【解决方案2】:

如果你想获得扩展名,你可以这样做:

def get_extension_name(filename):
    for index, char in enumerate(filename):
        if char == ".":
            return filename[index + 1:]

【讨论】:

  • 您最好从头到尾进行迭代,以避免将"bar.pdf" 作为"foo.bar.pdf" 的扩展;否则,您可以使用 filename[-filename[::-1].find("."):] 之类的东西
  • os.path.splitext already exists to do precisely this, more reliably(如果某些家庭作业禁止导入,str.rpartition 可以使用类似的效果)。
  • 我不使用系统上的路径,只有二进制文件,所以为什么我在收到请求时创建一个文件只是为了验证扩展名并保存在其他服务器中?
猜你喜欢
  • 2018-11-26
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2011-04-07
  • 2011-05-13
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多