[英]How do you retrieve the tags of a file in a list with Python (Windows Vista)?
我想為我擁有的各種文件夾制作一些標簽雲,但不幸的是,我似乎找不到在 Windows Vista 中訪問文件標簽的方法。 我嘗試查看 win32 模塊和 os.stat,但似乎找不到方法。 我能得到一些幫助嗎?
我使用了 win32 擴展包,以及我找到的一些演示代碼。 我在此線程上發布了該過程的詳細說明。 我不想在這里全部復制,但這里是簡短的版本(點擊前面的鏈接了解詳細信息)。
property_sets
方法(提供必要的文件路徑)。 該方法返回一個可迭代的生成器對象。 請參閱以下示例代碼和輸出。(這至少在 XP 中對我有用。)
例如
import your_new_module
propgenerator= your_new_module.property_sets('[your file path]')
for name, properties in propgenerator:
print name
for k, v in properties.items ():
print " ", k, "=>", v
上述代碼的輸出將類似於以下內容:
DocSummaryInformation
PIDDSI_CATEGORY => qux
SummaryInformation
PIDSI_TITLE => foo
PIDSI_COMMENTS => flam
PIDSI_AUTHOR => baz
PIDSI_KEYWORDS => flim
PIDSI_SUBJECT => bar
顯然,您需要使用Windows Search API來查找System.Keywords - 您可以通過ctypes
直接訪問 API,或通過 API 的COM 互操作程序集間接訪問(需要win32 擴展)。 抱歉,我沒有要檢查的 vista 安裝,但我希望這些鏈接有用!
似乎 Windows將標簽存儲在文件中。 只需標記任何圖像並在記事本中打開圖像並查找類似XML ( RDF )的內容,您就會在那里找到您的標記。 嗯......現在我們知道它們確實存儲在文件中,但我們仍然不知道如何操作它們。
但谷歌是救援。 我用谷歌搜索: windows 元數據 api
並找到了這個:http: //blogs.msdn.com/pix/archive/2006/12/06/photo-metadata-apis.aspx
實際上有 2 種不同的文檔屬性實現方式( source )。
COM 實現將它們直接嵌入到文件本身中:例如,這是用於 Office 文檔的方法。 本頁描述的 Tim Golden 的代碼非常適合這些。
在 NTFS 5(Win2k 或更高版本)上,您可以將摘要信息添加到任何文件,並將其存儲在備用數據流中。 我想 Windows Search API 可以處理這些,但我還沒有測試過。
在 Windows 中有點棘手,我發現的唯一方法是直接從文件中讀取它作為純字節:
OPENING_META_TAG = b"<x:xmpmeta xmlns:x=\"adobe:ns:meta/\">"
CLOSE_META_TAG = b"</x:xmpmeta>"
FIRST_LI_OPEN = b"<rdf:li>"
FIRST_LI_CLOSE = b"</rdf:li>"
METADATA_TAG_RE = OPENING_META_TAG + b"[\s\S]*" + CLOSE_META_TAG
TAG_LIST_RE = FIRST_LI_OPEN + b"(.*?)" + FIRST_LI_CLOSE
def read_tags_in_metadata_for_img(img_path:str) -> tuple:
"""
Reads all tags in the metadata of a jpeg and returns a list of their paths.
"""
with open(img_path, "rb") as f:
# Read all the lines as bytes
lines = b"".join(f.readlines())
# Retrieve the metadata part of the file
metadata = re.findall(METADATA_TAG_RE, lines)
if len(metadata) == 0: return None
elif len(metadata) == 1: metadata = metadata[0]
else: raise ValueError("Multiple metadata tags found in the file.")
# Get a list with every tag.
tags = re.findall(TAG_LIST_RE, metadata)
# Transform all the tags to strings
tags = tuple(tag.decode("utf-8") for tag in tags)
return tags
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.