常见对象遍历
astr = 'hello'
alist = ['tom', 'jerry']
atuple = (10, 20, 30)
adict = {'name': 'tom', 'age': 22}
aset = set('abc')
fname = '/etc/passwd'
for ch in astr:
print(ch)
for name in alist:
print(name)
for i in atuple:
print(i)
for key in adict:
print('%s : %s', (key, adict[key])
for i in aset:
print(i)
with open(fname) as fobj:
for line in fobj:
print(line)
时间戳
>>> import time
>>> time.time() //自1970-1-1 00:00:00到某一时间点之间的秒数
1557710846.0968487
>>> time.ctime() //世界协调时间
'Mon May 13 09:33:44 2019' //字符串时间,以英国格林威治所在经度为起始点,每隔15度角成为一个时区
struct_time:九元组
>>> time.localtime()
time.struct_time(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=9, tm_min=37, tm_sec=8, tm_wday=0, tm_yday=133, tm_isdst=0)
>>> t1 = time.localtime()
>>> t1.tm_year
2019
>>> t1.tm_hour
9
time模块
>>> import time
>>> time.time() # 自1970-1-1 00:00:00到time.time()之间的秒数
1557711710.3989246
>>> time.sleep(3) # 睡眠
>>> time.strftime('%Y-%m-%d %H:%M:%S') #接收时间元组,并返回以可读字符串表示的当地时间,格式由括号内format自定义
'2019-05-13 09:51:36'
>>> time.strftime('%a %A') # 周几 #%a表示本地简化星期名称,%A表示本地完整星期名称
'Mon Monday'
给定字符串和时间样式,将字符串转换成struct_time`
>>> t1 = time.strptime('2019-05-13 09:51:36', '%Y-%m-%d %H:%M:%S') #根据指定的格式把一个时间字符串解析为时间元组
>>> t1
time.struct_time(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=9, tm_min=51, tm_sec=36, tm_wday=0, tm_yday=133, tm_isdst=-1)
>>> t2 = time.localtime()
>>> t2
time.struct_time(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=9, tm_min=56, tm_sec=58, tm_wday=0, tm_yday=133, tm_isdst=0)
>>> t2 > t1
True
>>> t2 < t1
False
datetime时间模块
>>> from datetime import datetime
>>> datetime.now() #返回的对象,各部分是年月日时分秒毫秒
datetime.datetime(2019, 5, 13, 10, 47, 29, 235159)
>>> t = datetime.now()
>>> t.year
2019
>>> t.month
5
>>> t.day
13
>>> t.hour
10
>>> t.minute
48
>>> t.second
32
>>> t.microsecond
570523
>>> t.strftime('%Y%m%d %H:%M:%S')
'20190513 10:48:32'
>>> datetime.strptime('2019-05-13 12:00:00', '%Y-%m-%d %H:%M:%S')
datetime.datetime(2019, 5, 13, 12, 0)
>>> t1 = datetime(2019, 5, 13)
>>> t1
datetime.datetime(2019, 5, 13, 0, 0)
练习01:将一段时间内的日志提取出来
[root@room9pc01 day06]# vim mylog.log //编写日志文件
2019-05-13 08:42:26 00000000000
2019-05-13 09:51:36 aaaaaa
2019-05-13 09:52:36 bbbbbbbbb
2019-05-13 09:58:36 cccccccccc
2019-05-13 10:01:36 ddddddd
2019-05-13 11:30:36 eeeeeeee
2019-05-13 12:25:46 ffffffffffff
2019-05-13 13:21:30 gggggggggg
[root@room9pc01 day06]# vim mylog.py //编写切割日志程序
import time
t9 = time.strptime('2019-05-13 09:00:00', '%Y-%m-%d %H:%M:%S')
t12 = time.strptime('2019-05-13 12:00:00', '%Y-%m-%d %H:%M:%S')
with open('mylog.log') as fobj:
for line in fobj:
tstr = line[:19] #取出字符串前19个字符
#print(tstr)
t = time.strptime(tstr, '%Y-%m-%d %H:%M:%S')
if t9 < t < t12:
print(line, end='')
[root@room9pc01 day06]# python3 mylog.py
2019-05-13 09:51:36 aaaaaa
2019-05-13 09:52:36 bbbbbbbbb
2019-05-13 09:58:36 cccccccccc
2019-05-13 10:01:36 ddddddd
2019-05-13 11:30:36 eeeeeeee
timedelta时间模块
>>> from datetime import datetime,timedelta
>>> t1 = datetime.now()
>>> t2 = timedelta(days=100, hours=1)
>>> t1 - t2 #100天零1个小时之前的时间
datetime.datetime(2019, 2, 2, 10, 26, 6, 755687)
>>> t1 + t2 #100天零1个小时之后的时间
datetime.datetime(2019, 8, 21, 12, 26, 6, 755687)
异常处理
当程序不能正常工作时,程序出现错误,它将崩溃终止执行,这时程序默认向终端抛出异常。
把有可能发生异常的语句,放到try中执行。通过except捕获异常,异常不发生才需要执行的语句,放到else中。异常不管是否发生,都要执行的语句,放到finally中。
[root@room9pc01 day06]# vim myerr.py
try:
nums = int(input('number: '))
result = 100 / nums
print(result)
except ValueError:
print('无效输入')
exit(1)
except KeyboardInterrupt:
print('\n你按了“ctrl+c”')
exit(2)
except ZeroDivisionError:
print('除数不能为0')
exit(3)
except EOFError:
print('\n输入无效(ctrl+d)')
exit(4)
#print('Done')
[root@room9pc01 day06]# python3 myerr.py
number: 1
100.0
[root@room9pc01 day06]# python3 myerr.py
number: 5
20.0
[root@room9pc01 day06]# python3 myerr.py
number:
输入无效(ctrl+d)
[root@room9pc01 day06]# python3 myerr.py
number: ^C
你按了“ctrl+c”
[root@room9pc01 day06]# python3 myerr.py
number: 0
除数不能为0
[root@room9pc01 day06]# python3 myerr.py
number:
无效输入
在编写程序时,并不总是需要写全部的语法,用的最多的组合是try-except和try- nally
[root@room9pc01 day06]# vim myerr2.py
try:
nums = int(input('number: '))
result = 100 / nums
except (ValueError, EOFError): #输入ctrl+d或者Enter时异常处理
print('无效输入')
#exit(1)
except KeyboardInterrupt:
print('\n你按了“ctrl+c”')
#exit(2)
except ZeroDivisionError:
print('除数不能为0')
#exit(3)
else:
print(result)
finally:
print('Done')
[root@room9pc01 day06]# python3 myerr2.py
number: 5
20.0
Done
[root@room9pc01 day06]# python3 myerr2.py
number:
无效输入
Done
[root@room9pc01 day06]# python3 myerr2.py
number: 无效输入
Done
[root@room9pc01 day06]# python3 myerr2.py
number: ^C
你按了“ctrl+c”
Done
[root@room9pc01 day06]# python3 myerr2.py
number: 0
除数不能为0
Done
os模块
>>> import os
>>> os.getcwd() #pwd
'/root'
>>> os.listdir() #ls
>>> os.listdir('/home') #ls /home
>> os.mkdir('/tmp/demo') #mkdir /temp/demo
>>> os.makedirs('/tmp/aaa/bbb') #mkdir -p /temp/aaa/bbb
>>> os.chdir('/root/桌面/python') #cd /root/桌面/python
>>> os.symlink('/etc/hosts', 'zhuji') #ln -s
>>> import shutil
>>> shutil.copy('/etc/passwd', 'passwd')
'passwd'
>>> os.listdir()
['passwd', 'zhuji', 'nsd2019', 'zzg_pypkgs', 'zzg_pypkgs.tar.gz']
>>> os.stat('passwd') #stat passwd
os.stat_result(st_mode=33188, st_ino=2638715, st_dev=2050, st_nlink=1, st_uid=0, st_gid=0, st_size=2929, st_atime=1557747976, st_mtime=1557747976, st_ctime=1557747976)
>>> mima = os.stat('passwd')
>>> mima.st_size
2929
>>> time.ctime(mima.st_atime) //查看最后访问时间(access time)
'Mon May 13 19:46:16 2019'
>>> time.ctime(mima.st_mtime) //查看最后修改时间(modify time)
'Mon May 13 19:46:16 2019'
>>> time.ctime(mima.st_ctime) //查看文件的权限、拥有者、所属的组、链接数发生改变时的时间(change time)
'Mon May 13 19:46:16 2019'
linux中文件权限的数值为八进制
[root@room9pc01 python]# ll //查看passwd文件修改前权限
总用量 776572
drwxr-xr-x 8 root root 4096 5月 10 11:04 nsd2019
-rw-r--r-- 1 root root 2929 5月 13 19:46 passwd //权限为644
lrwxrwxrwx 1 root root 10 5月 13 15:37 zhuji -> /etc/hosts
drwxr-xr-x 16 ftp ftp 4096 1月 4 09:13 zzg_pypkgs
-rw-r--r-- 1 root root 795192400 5月 7 08:56 zzg_pypkgs.tar.gz
>>> os.chmod('passwd', 0o755) #修改passwd文件权限为755
[root@room9pc01 python]# ll #查看passwd文件修改后权限
总用量 776572
drwxr-xr-x 8 root root 4096 5月 10 11:04 nsd2019
-rwxr-xr-x 1 root root 2929 5月 13 19:46 passwd //权限变为755
lrwxrwxrwx 1 root root 10 5月 13 15:37 zhuji -> /etc/hosts
drwxr-xr-x 16 ftp ftp 4096 1月 4 09:13 zzg_pypkgs
-rw-r--r-- 1 root root 795192400 5月 7 08:56 zzg_pypkgs.tar.gz
>>> 0o644 #权限644对应的八进制数
420
>>> os.chmod('passwd', 420) #修改passwd文件权限为644
[root@room9pc01 python]# ll #查看passwd文件修改后权限
总用量 776572
drwxr-xr-x 8 root root 4096 5月 10 11:04 nsd2019
-rw-r--r-- 1 root root 2929 5月 13 19:46 passwd #权限变为644
lrwxrwxrwx 1 root root 10 5月 13 15:37 zhuji -> /etc/hosts
drwxr-xr-x 16 ftp ftp 4096 1月 4 09:13 zzg_pypkgs
-rw-r--r-- 1 root root 795192400 5月 7 08:56 zzg_pypkgs.tar.gz
>>> os.chown('passwd', 1009, 1009) #chown
[root@room9pc01 python]# ll
总用量 776572
drwxr-xr-x 8 root root 4096 5月 10 11:04 nsd2019
-rw-r--r-- 1 tom tom 2929 5月 13 19:46 passwd //所有者和所属组变为tom
lrwxrwxrwx 1 root root 10 5月 13 15:37 zhuji -> /etc/hosts
drwxr-xr-x 16 ftp ftp 4096 1月 4 09:13 zzg_pypkgs
-rw-r--r-- 1 root root 795192400 5月 7 08:56 zzg_pypkgs.tar.gz
>>> os.getcwd()
'/root/桌面/python'
>>> os.listdir()
['zhuji', 'nsd2019', 'zzg_pypkgs', 'zzg_pypkgs.tar.gz']
>>> os.path.abspath('nsd2019')
'/root/桌面/python/nsd2019'
>>> fname = os.path.abspath('nsd2019')
>>> fname
'/root/桌面/python/nsd2019'
>>> os.path.basename(fname)
'nsd2019'
>>> os.path.dirname(fname)
'/root/桌面/python'
>>> os.path.split(fname)
('/root/桌面/python', 'nsd2019')
>>> os.path.join('/root/桌面/python', 'nsd2019')
'/root/桌面/python/nsd2019'
>>> os.path.isdir('/etc/abc') #[ -d /etc/abc ]
False
>>> os.path.isfile('/root/桌面/python/nsd2019') #[ -f /root/桌面/python/nsd2019 ]
False
>>> os.path.islink('/root/桌面/python/zhuji') #是链接吗
True
>>> os.path.ismount('/') #是挂载点吗
True
>>> os.path.exists('/etc') #存在吗
True
pickle模块
常规的文件,只能写入字符串,不能写其他数据类型
>>> f = open('/tmp/data', 'w')
>>> f.write('ni hao\n')
7
>>> f.write({'name': 'bob', 'age': 23, 'sex': 'male'})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not dict
>>> f.close()
pickle模块可以把任意的数据类型写入到文件,还可以无损地取出来。
>>> import pickle
>>> shop_list = {'eggs': 3, 'apple': 6, 'banana': 5}
>>> with open('/tmp/shop.data', 'wb') as fobj:
... pickle.dump(shop_list, fobj)
...
>>> with open('/tmp/shop.data', 'rb') as fobj:
... myadict = pickle.load(fobj)
...
>>> type(myadict)
<class 'dict'>
>>> myadict
{'eggs': 3, 'apple': 6, 'banana': 5}
>>> myadict['eggs']
3
案例:记账程序
- 假设在记账时,有一万元钱
- 无论是开销还是收入都要进行记账
- 记账内容包括时间、金额和说明等
- 记账数据要求永久存储
[root@room9pc01 day07]# vim account.py
import os
import pickle
from time import strftime
def save(fname):
try:
amount = int(input('金额:'))
comment = input('备注:')
except (KeyboardInterrupt, EOFError, ValueError):
print('\n无效输入,返回')
return #提前结束函数并返回
data = strftime('%Y-%m-%d')
with open(fname, 'rb') as fobj:
records = pickle.load(fobj)
balance = records[-1][-2] + amount
record = [data, amount, 0, balance, comment]
records.append(record)
with open(fname, 'wb') as fobj:
pickle.dump(records,fobj)
def cost(fname):
try:
amount = int(input('金额:'))
comment = input('备注:')
except (KeyboardInterrupt, EOFError, ValueError):
print('\n无效输入,返回')
return #提前结束函数并返回
data = strftime('%Y-%m-%d')
with open(fname, 'rb') as fobj:
records = pickle.load(fobj)
balance = records[-1][-2] - amount
record = [data, 0, amount, balance, comment]
records.append(record)
with open(fname, 'wb') as fobj:
pickle.dump(records, fobj)
def query(fname):
print('%-12s%-8s%-8s%-12s%-20s' % ('data', 'save', 'cost', 'balance', 'comment'))
with open(fname, 'rb') as fobj:
records = pickle.load(fobj)
for record in records:
print('%-12s%-8s%-8s%-12s%-20s' % tuple(record))
def show_menu():
cmds = {'0': save, '1': cost, '2': query}
prompt = '''(0)收入
(1)支出
(2)查询
(3)退出
请输入(0/1/2/3): '''
fname = 'account.data'
if not os.path.exists(fname):
init_data = [
['2019-05-14', 0, 0, 10000, 'init'],
]
with open(fname, 'wb') as fobj:
pickle.dump(init_data, fobj)
while True:
try:
choice = input(prompt).strip()
except (KeyboardInterrupt, EOFError, KeyError):
choice = '3'
if choice not in ['0', '1', '2', '3']:
print('无效输入,请重试')
if choice == '3':
print('\nBye-bye')
break
cmds[choice](fname)
if __name__ == '__main__':
show_menu()