Bob*_*Bob 2 python windows metadata
在过去的两天里,我一直在扫描互联网,试图找到问题的解决方案.我有一个不同文件的文件夹.他们运行文件类型的开局.我正在尝试编写一个python脚本,它将读取每个文件中的元数据(如果存在).目的是最终将数据输出到文件以与另一个程序的元数据提取进行比较.
我找到了一些例子,它适用于目录中的极少数文件.我找到的所有方法都涉及打开一个Storage Container对象.我是Python新手,不知道什么是Storage Container对象.我只知道我的大多数文件在尝试使用时都会出错
pythoncom.StgOpenStorage(<File Name>, None, flags)
Run Code Online (Sandbox Code Playgroud)
只有少数实际工作,我能够获得主要元数据标签,如标题,主题,作者,创建等.
有没有人知道存储容器以外的方式来获取元数据?此外,如果有一种更简单的方法用另一种语言来做,请务必提出建议.
谢谢
小智 7
您可以使用Shell com对象检索Explorer中可见的任何元数据:
import win32com.client
sh=win32com.client.gencache.EnsureDispatch('Shell.Application',0)
ns = sh.NameSpace(r'm:\music\Aerosmith\Classics Live!')
colnum = 0
columns = []
while True:
colname=ns.GetDetailsOf(None, colnum)
if not colname:
break
columns.append(colname)
colnum += 1
for item in ns.Items():
print (item.Path)
for colnum in range(len(columns)):
colval=ns.GetDetailsOf(item, colnum)
if colval:
print('\t', columns[colnum], colval)
Run Code Online (Sandbox Code Playgroud)
我决定写下自己的答案,试图结合和澄清上面的答案(这极大地帮助我解决了我的问题)。
我想说这个问题有两种解决方法。
情况1:你知道文件包含哪些元数据(你对哪些元数据感兴趣)。
在这种情况下,假设您有一个字符串列表,其中包含您感兴趣的元数据。我在这里假设这些标签是正确的(即您对 .txt 文件的像素数不感兴趣)。
metadata = ['Name', 'Size', 'Item type', 'Date modified', 'Date created']
Run Code Online (Sandbox Code Playgroud)
现在,使用 Greedo 和 Roger Upole 提供的代码创建了一个函数,它分别接受文件的完整路径和名称,并返回包含感兴趣的元数据的字典:
metadata = ['Name', 'Size', 'Item type', 'Date modified', 'Date created']
Run Code Online (Sandbox Code Playgroud)
结果:
{'Name': 'BMW series 1 owners manual.pdf', 'Size': '11.4 MB', 'Item type': 'Foxit Reader PDF Document', 'Date modified': '8/30/2020 11:10 PM', 'Date created': '8/30/2020 11:10 PM'}
Run Code Online (Sandbox Code Playgroud)
这是正确的,因为我刚刚创建了该文件,并且使用 Foxit PDF 阅读器作为我的主要 pdf 阅读器。因此,该函数返回一个字典,其中键是元数据标签,值是给定文件的这些标签的值。
情况2:您不知道文件包含哪些元数据
这是一个有点困难的情况,特别是在最优性方面。我分析了 Roger Upole 提出的代码,基本上,他尝试读取None文件的元数据,这导致他获得所有可能的元数据标签的列表。所以我认为硬拷贝这个列表然后尝试读取每个标签可能会更容易。这样,一旦完成,您将拥有一个包含文件实际拥有的所有标签的字典。
只需复制我认为是每个可能的元数据标签,然后尝试从文件中获取所有标签。基本上,只需复制 python 列表的声明,并使用上面的代码(用这个新列表替换元数据):
metadata = ['Name', 'Size', 'Item type', 'Date modified', 'Date created', 'Date accessed', 'Attributes', 'Offline status', 'Availability', 'Perceived type', 'Owner', 'Kind', 'Date taken', 'Contributing artists', 'Album', 'Year', 'Genre', 'Conductors', 'Tags', 'Rating', 'Authors', 'Title', 'Subject', 'Categories', 'Comments', 'Copyright', '#', 'Length', 'Bit rate', 'Protected', 'Camera model', 'Dimensions', 'Camera maker', 'Company', 'File description', 'Masters keywords', 'Masters keywords']
Run Code Online (Sandbox Code Playgroud)
我认为这不是一个很好的解决方案,但另一方面,您可以将此列表保留为全局变量,然后使用它,而无需将其传递给每个函数调用。为了完整起见,以下是使用此新元数据列表的上一个函数的输出:
{'Name': 'BMW series 1 owners manual.pdf', 'Size': '11.4 MB', 'Item type': 'Foxit Reader PDF Document', 'Date modified': '8/30/2020 11:10 PM', 'Date created': '8/30/2020 11:10 PM', 'Date accessed': '8/30/2020 11:10 PM', 'Attributes': 'A', 'Perceived type': 'Unspecified', 'Owner': 'KEMALS-ASPIRE-E\\kemal', 'Kind': 'Document', 'Rating': 'Unrated'}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,返回的字典现在包含该文件包含的所有元数据。这样做的原因是因为if 语句:
if attribute_value:
Run Code Online (Sandbox Code Playgroud)
这意味着只要属性等于None,它就不会被添加到返回的字典中。
我要强调的是,如果处理许多文件,最好将列表声明为全局/静态变量,而不是每次都将其传递给函数。
问题在于 Windows 有两种存储文件元数据的方式。您使用的方法适用于 COM 应用程序创建的文件;该数据包含在文件本身内。然而,随着 NTFS5 的引入,任何文件都可以包含元数据作为备用数据流的一部分。因此,成功的文件可能是 COM 应用程序创建的文件,而失败的文件则不是。
下面是处理 COM 应用程序创建的文件的一种可能更可靠的方法:从任何文件获取文档摘要信息。
使用备用数据流,可以直接读取它们:
meta = open('myfile.ext:StreamName').read()
Run Code Online (Sandbox Code Playgroud)
更新:好的,现在我发现这些都不相关,因为您追求的是文档元数据而不是文件元数据。问题的清晰度可以带来多大的不同:|
试试这个:如何在 python 中检索 Office 文件的作者?
| 归档时间: |
|
| 查看次数: |
12849 次 |
| 最近记录: |