1、当前工作目录
>>> import os
>>> os.getcwd()
'/root'
>>> os.chdir('/')
>>> os.getcwd
<built-in function getcwd>
>>> os.getcwd()
'/'
2、os.path
>>> os.path.join('/root','rpmbuild')
'/root/rpmbuild'
>>> os.path.expand
os.path.expanduser( os.path.expandvars(
>>> os.path.expanduser('~')
'/root'
>>> pathname = '/root/rpmbuild/test.py'
>>> os.path.split
os.path.split( os.path.splitdrive( os.path.splitext(
>>> (dirname, filename) = os.path.split(pathname)
>>> dirname
'/root/rpmbuild'
>>> filename
'test.py'
>>> (shortname, extname) = os.path.splitext(filename)
>>> shortname
'test'
>>> extname
'.py'
glob模块:
>>> os.chdir('/Users/pilgrim/diveintopython3/')
>>> import glob
>>> glob.glob('examples/*.xml') ①
['examples\\feed-broken.xml',
'examples\\feed-ns0.xml',
'examples\\feed.xml']
>>> os.chdir('examples/') ②
>>> glob.glob('*test*.py') ③
['alphameticstest.py',
'pluraltest1.py',
'pluraltest2.py',
'pluraltest3.py',
'pluraltest4.py',
'pluraltest5.py',
'pluraltest6.py',
'romantest1.py',
'romantest10.py',
'romantest2.py',
'romantest3.py',
'romantest4.py',
'romantest5.py',
'romantest6.py',
'romantest7.py',
'romantest8.py',
'romantest9.py']
glob模块使用shell风格的通配符。
>>> os.getcwd()
'/'
>>> metadata = os.st
os.stat( os.stat_float_times( os.stat_result( os.statvfs( os.statvfs_result( os.strerror(
>>> metadata = os.stat('root')
>>> metadata.st_mtime
1341960602.2973578
>>> import time
>>> time.localtime(metadata.st_mtime)
time.struct_time(tm_year=2012, tm_mon=7, tm_mday=11, tm_hour=6, tm_min=50, tm_sec=2, tm_wday=2, tm_yday=193, tm_isdst=0)
构造绝对路径:
>>> os.getcwd()
'/'
>>> os.chdir('root')
>>> os.path.realpath('rpmbuild')
'/root/rpmbuild'
列表解析:
>>> import os, glob
>>> glob.glob('*.xml') ①
['feed-broken.xml', 'feed-ns0.xml', 'feed.xml']
>>> [os.path.realpath(f) for f in glob.glob('*.xml')] ②
['c:\\Users\\pilgrim\\diveintopython3\\examples\\feed-broken.xml',
'c:\\Users\\pilgrim\\diveintopython3\\examples\\feed-ns0.xml',
'c:\\Users\\pilgrim\\diveintopython3\\examples\\feed.xml']
通过if语句过滤列表,对列表中的每一个元素,if关键字后的表达式都会被计算,如果表达式为真,则元素会被包含进输出结果中。
>>> import os, glob
>>> [f for f in glob.glob('*.py') if os.stat(f).st_size > 6000] ①
['pluraltest6.py',
'romantest10.py',
'romantest6.py',
'romantest7.py',
'romantest8.py',
'romantest9.py']
>>> import os, glob
>>> [(os.stat(f).st_size, os.path.realpath(f)) for f in glob.glob('*.xml')] ①
[(3074, 'c:\\Users\\pilgrim\\diveintopython3\\examples\\feed-broken.xml'),
(3386, 'c:\\Users\\pilgrim\\diveintopython3\\examples\\feed-ns0.xml'),
(3070, 'c:\\Users\\pilgrim\\diveintopython3\\examples\\feed.xml')]
字典解析:
字典解析和列表解析类型,只不过它生产字典而不是列表。
>>> import os, glob
>>> metadata = [(f, os.stat(f)) for f in glob.glob('*test*.py')] ①
>>> metadata[0] ②
('alphameticstest.py', nt.stat_result(st_mode=33206, st_ino=0, st_dev=0,
st_nlink=0, st_uid=0, st_gid=0, st_size=2509, st_atime=1247520344,
st_mtime=1247520344, st_ctime=1247520344))
>>> metadata_dict = {f:os.stat(f) for f in glob.glob('*test*.py')} ③
>>> type(metadata_dict) ④
<class 'dict'>
>>> list(metadata_dict.keys()) ⑤
['romantest8.py', 'pluraltest1.py', 'pluraltest2.py', 'pluraltest5.py',
'pluraltest6.py', 'romantest7.py', 'romantest10.py', 'romantest4.py',
'romantest9.py', 'pluraltest3.py', 'romantest1.py', 'romantest2.py',
'romantest3.py', 'romantest5.py', 'romantest6.py', 'alphameticstest.py',
'pluraltest4.py']
>>> metadata_dict['alphameticstest.py'].st_size ⑥
2509
① 这不是字典解析; 而是列表解析。它找到所有名称中包含test的.py文件,然后构造包含文件名和文件元信息(通过调用os.stat()函数得到)的元组。
② 结果列表的每一个元素是元组。
③ 这是一个字典解析。 除了两点以外,它的语法同列表解析很类似。首先,它被花括号而不是方括号包围; 第二,对于每一个元素它包含由冒号分隔的两个表达式,而不是列表解析的一个。冒号前的表达式(在这个例子中是f)是字典的键;冒号后面的表达式(在这个例子中是os.stat(f))是值。
④ 字典解析返回结果是字典。
⑤ 这个字典的键很简单,就是glob.glob('*test*.py')调用返回的文件名。
⑥ 每一个键对应的值是os.stat()函数的返回值。这意味着我们可以在字典中通过文件名查找到它的文件元信息。元信息的一个部分是文件大小st_size。这个文件alphameticstest.py 的大小是2509字节。
>>> import os, glob, humansize
>>> metadata_dict = {f:os.stat(f) for f in glob.glob('*')} ①
>>> humansize_dict = {os.path.splitext(f)[0]:humansize.approximate_size(meta.st_size) \
... for f, meta in metadata_dict.items() if meta.st_size > 6000} ②
>>> list(humansize_dict.keys()) ③
['romantest9', 'romantest8', 'romantest7', 'romantest6', 'romantest10', 'pluraltest6']
>>> humansize_dict['romantest9'] ④
'6.5 KiB'
① 这个字典解析获得当前目录下所有的文件的列表(glob.glob('*')),通过os.stat(f)获得每一个文件的元信息, 然后构造一个键是文件名,值是文件元信息的字典。
② 这个字典解析在前一个基础上过滤掉文件小于6000字节的文件(if meta.st_size > 6000), 并用过滤出的列表构造字典, 字典的键是文件名去掉扩展名的部分(os.path.splitext(f)[0]) ,字典的值是每个文件的人类可读的近似大小(humansize.approximate_size(meta.st_size))。
③ 正如你在前一个例子中所看见的,有6个这样的文件,所以字典中有6个元素。
④ 每一个键对应的值是approximate_size()函数返回的字符串。
>>> a_dict = {'a': 1, 'b': 2, 'c': 3}
>>> {value:key for key, value in a_dict.items()}
{1: 'a', 2: 'b', 3: 'c'}
集合解析:
>>> a_set = set(range(10))
>>> a_set
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> {x ** 2 for x in a_set} ①
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> {x for x in a_set if x % 2 == 0} ②
{0, 8, 2, 4, 6}
>>> {2**x for x in range(10)} ③
{32, 1, 2, 4, 8, 64, 128, 256, 16, 512}
① 集合解析可以接受一个集合作为参数。这个集合解析计算数字0-9这个集合的的平方。
② 同列表解析和字典解析一样, 集合解析也可以包含if 字句来在将元素放入结果集合前进行过滤。
③ 集合解析的输入并不一定要是集合; 可以是任何序列。