如何访问特定于Mac的文件元数据?

时间:2013-09-13 05:56:13

标签: python macos

根据此页面,不同的操作系统可以从os.stat函数返回不同的信息。

http://docs.python.org/2/library/os.html

我有兴趣获得类型和创建者。

import os
from stat import *
print(os.stat('filename').st_ino)
print(os.stat('filename').st_creator)

此代码适用于inode(st_ino),但为创建者提供了错误:

  

AttributeError:'posix.stat_result'对象没有属性'st_creator'

与st_type和st_rsize相同。

我必须做一些特别的工作才能使这些工作起作用吗?

(这是Mac OS X 10.5和10.8与Python 2.我是Python的新手。)

3 个答案:

答案 0 :(得分:3)

正如另一个答案所提到的,文档中的Mac OS意味着预OS X.在经典的Mac OS中,stat被模拟,而Python stat实际上意味着OS X上的stat

因此,您没有获得os.stat的类型和创建者。相应的低级调用是getattrlist,但这不是Python包装的(你也不应该使用它)。您可以通过打印确切地看到stat返回的内容:

>>> import os
>>> s = os.stat('foo')
>>> s
posix.stat_result(st_mode=33152, st_ino=18294505, st_dev=16777218L, st_nlink=1,
st_uid=501, st_gid=501, st_size=0, st_atime=1379052292, st_mtime=1379052292,
st_ctime=1379052308)

让我们在foo上设置一个类型和创建者来测试:

% SetFile -t 'TYPE' -c 'CREA' foo

Python 2.x中的简单答案是MacOS.GetCreatorAndType。但是,它已经消失了3.x并且它使用的基础机制已被弃用。如果你的目标只是为自己完成一些事情,那么一定要使用它。

>>> import MacOS
>>> MacOS.GetCreatorAndType('foo')
('CREA', 'TYPE')

更加面向未来的机制是使用PyObjC,它适用于Python 3.x并且不使用已弃用的OS X API:

>>> from Foundation import NSFileManager, NSFileHFSCreatorCode, NSFileHFSTypeCode
>>> attributes = NSFileManager.defaultManager().attributesOfItemAtPath_error_('foo', None)[0]
>>> attributes[NSFileHFSTypeCode]
1415139397L
>>> attributes[NSFileHFSCreatorCode]
1129465153L

它们以整数形式出现,因为PyObjC没有四字符代码的映射(也没有适当的元数据来理解它的内容)。这是一个快速映射函数,用于检索四个字符的字符串:

>>> def decode(f): return ''.join(chr(f >> i * 8 & 0xff) for i in xrange(3,-1,-1))
... 
>>> decode(attributes[NSFileHFSCreatorCode])
'CREA'
>>> decode(attributes[NSFileHFSTypeCode])
'TYPE'

(如果您使用的是Python 3,请将xrange替换为上面的range。)

请注意,通常,在OS X中不会使用类型/创建者;它们的功能已被文件扩展名,UTI,MIME类型,每用户和每文档应用程序绑定所取代。

答案 1 :(得分:1)

" Mac OS"在这里的文档中意味着Mac OS Classic,即在X之前。对于OSX,unix和FreeBSD注释是相关的。

答案 2 :(得分:0)

您可以查看

print(dir(os.stat('filename')))

查看系统中可用的属性。 不幸的是,Mac OS X 不会返回文件所有者的用户名,因此您需要pwd之类的内容来将用户ID“翻译”为用户名。

import os
import pwd

uid = os.stat('filename').st_uid
owner = pwd.getpwuid(uid)
print(owner)
print(owner.pw_name)