【问题标题】:Check if an image file is a valid SVG file in python检查图像文件是否是python中的有效SVG文件
【发布时间】:2020-12-04 17:02:39
【问题描述】:

我正在寻找一种方法来确定 image_file 是否是有效的 SVG 文件。

This answer 使用 imghdr 适用于其他文件类型、PNG 等,但对于 SVG,它只返回 None

我可以使用不同的包,或者除了检查文件扩展名之外的其他方法来确保 image_file 是 SVG?

【问题讨论】:

  • 在一个xml解析器中加载它,使用解析器检查根元素是svg并且在SVG命名空间中
  • 如果我的回答对您有所帮助,您介意“接受”吗?我可以将这些点用于个人目标。当然,如果您需要进一步调整以使其对您有用,我仍然可以解决此问题。

标签: python image svg


【解决方案1】:
import re
from urllib.request import urlopen

SVG_R = r'(?:<\?xml\b[^>]*>[^<]*)?(?:<!--.*?-->[^<]*)*(?:<svg|<!DOCTYPE svg)\b'
SVG_RE = re.compile(SVG_R, re.DOTALL)

# an example SVG file:
f = urlopen("https://upload.wikimedia.org/wikipedia/commons/1/17/Yin_yang.svg")

file_contents = f.read().decode('latin_1')  # avoid any conversion exception

is_svg = SVG_RE.match(file_contents) is not None

print(['NOT SVG', 'SVG'][is_svg])  # prints SVG

一种可能的优化是只读取和/或解码前 N 个字节。确定 N 的问题在于,在&lt;svg&lt;!DOCTYPE svg 之前可能有非常长的cmets。

该正则表达式已在我的 Mac 上使用 32120 个 SVG 文件进行了验证。

【讨论】:

  • 有趣,所以正则表达式只是检查文件内容是否为有效的 svg 格式?
  • 嗯,它会检查文件的start 是否是有效的SVG 格式。但这也是imghdr 所做的......
  • 在对answer 的评论中解决了浏览器环境中的相同问题,有人向我指出,对 XML 序言的测试可能是一个过于严格的要求。
  • @ccprog 我不太明白你的话,但感谢the specs 的链接,它告诉我可以删除不区分大小写。
  • 我的意思是,即使缺少 XML prolog 并且文件以根 &lt;svg&gt; 元素开头,浏览器也会呈现独立的 SVG 文件。其他渲染器可能会抱怨或不抱怨。有效性可能是一个取决于您的用例的概念。
猜你喜欢
  • 2010-10-27
  • 2017-08-31
  • 2014-11-15
  • 2014-08-09
  • 2015-11-15
  • 2020-02-10
  • 1970-01-01
相关资源
最近更新 更多