簡體   English   中英

如何使用 Python (Windows Vista) 檢索列表中文件的標簽?

[英]How do you retrieve the tags of a file in a list with Python (Windows Vista)?

我想為我擁有的各種文件夾制作一些標簽雲,但不幸的是,我似乎找不到在 Windows Vista 中訪問文件標簽的方法。 我嘗試查看 win32 模塊和 os.stat,但似乎找不到方法。 我能得到一些幫助嗎?

我使用了 win32 擴展包,以及我找到的一些演示代碼。 我在此線程上發布了該過程的詳細說明。 我不想在這里全部復制,但這里是簡短的版本(點擊前面的鏈接了解詳細信息)。

  1. 下載並安裝pywin32 擴展
  2. 獲取 Tim Golden 為這項任務編寫的代碼
  3. 將 Tim 的代碼作為模塊保存在您自己的計算機上。
  4. 調用新模塊的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將標簽存儲在文件中 只需標記任何圖像在記事本中打開圖像並查找類似XMLRDF )的內容,您就會在那里找到您的標記。 嗯......現在我們知道它們確實存儲在文件中,但我們仍然不知道如何操作它們。

但谷歌是救援。 我用谷歌搜索: windows 元數據 api

並找到了這個:http: //blogs.msdn.com/pix/archive/2006/12/06/photo-metadata-apis.aspx

實際上有 2 種不同的文檔屬性實現方式( source )。

  1. COM 實現將它們直接嵌入到文件本身中:例如,這是用於 Office 文檔的方法。 本頁描述的 Tim Golden 的代碼非常適合這些。

  2. 在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM