python:对象遍历、time模块、日志提取、异常处理、os模块和pickle模块

常见对象遍历

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

案例:记账程序

  1. 假设在记账时,有一万元钱
  2. 无论是开销还是收入都要进行记账
  3. 记账内容包括时间、金额和说明等
  4. 记账数据要求永久存储
[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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下方法来下载和安装这些 Python 模块: 1. os 模块os 模块Python 的内置模块,无需额外下载安装。您可以直接在您的 Python 脚本中导入并使用它。 2. time 模块time 模块也是 Python 的内置模块,无需额外下载安装。您可以直接在您的 Python 脚本中导入并使用它。 3. pickle 模块pickle 模块也是 Python 的内置模块,无需额外下载安装。您可以直接在您的 Python 脚本中导入并使用它。 4. selenium 模块:selenium 是一个用于自动化浏览器操作的 Python 模块。您可以使用以下步骤来下载和安装 selenium 模块: - 使用 pip 安装 selenium:在命令行中运行以下命令来安装 selenium 模块: ``` pip install selenium ``` - 下载并安装浏览器驱动程序:selenium 需要与特定的浏览器驱动程序进行配合使用。您需要根据您使用的浏览器类型和版本,下载相应的浏览器驱动程序,并将其添加到系统路径中。 例如,如果您使用的是 Chrome 浏览器,可以从以下链接下载 Chrome 驱动程序:https://sites.google.com/a/chromium.org/chromedriver/downloads 下载完成后,将驱动程序解压缩,并将可执行文件移动到系统的 PATH 路径下,或者在代码中指定驱动程序的路径。 - 导入并使用 selenium 模块:在您的 Python 脚本中导入 selenium 模块,并使用它来进行浏览器自动化操作。 希望这些信息能对您有所帮助!如果您有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值