1

根据这个页面,不同的操作系统可以从 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 相同。

我必须做一些特别的事情才能让这些工作吗?

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

4

3 回答 3

3

正如另一个答案所提到的,文档中的 Mac OS 是指 OS X 之前的版本。在经典的 Mac OS 中,stat是模拟的,而 Pythonstat实际上是指statOS X 上的。

因此,您不会通过 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 类型、每用户和每文档应用程序绑定所取代。

于 2013-09-13T06:44:33.587 回答
1

此处文档中的“Mac OS”是指 Mac OS Classic,即在 X 之前。对于 OSX,unix 和 FreeBSD 注释是相关的。

于 2013-09-13T06:12:30.063 回答
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)
于 2013-09-13T06:29:26.607 回答