python集锦(三)

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 字句来在将元素放入结果集合前进行过滤。
③	集合解析的输入并不一定要是集合; 可以是任何序列。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值