异常、try 语句、raise 语句、bytes和bytearr

2021-07-22  本文已影响0人  秋天丢了李姑娘

异常

try 语句

try:
可能发生异常的语句块
except 错误类型1 [as 变量名1]:
异常处理语句块1
except 错误类型2 [as 变量名2]:
异常处理语句块2
...
except 错误类型n [as 变量名n]:
异常处理语句块n
except:
异常处理语句块other
else:
未发生异常的语句
finally:
最终的处理语句

raise 语句

字节串 bytes 和字节数组 bytearray

1 一个字节(byte)是8个二进制的位 (bit)

1个byte的取值范围是 0 ~ 255

bytes 不可变

bytearray 可变

字节串的字面值

>>> b''
>>> b""
>>> b''''''
>>> b''''''
>>> b'ABC'
>>> bytes([65, 66, 67, 68])
>>> bytes([65, 66, 67, 68, 200,255])
>>> bytes([65, 66, 67, 68, 200,255, 300])  # 300 超出了255 报错
>>> bytearray([65, 66, 67, 68, 200,255])   # 字节数组的创建必须使用bytearray函数

索引和切片

文件

mynote.txt 文件中的内容

我是老魏
我在 tarena

读数据

>>> f = open('mynote.txt', 'rb')
>>> f.read()  # 返回全部
b'\xe6\x88\x91\xe6\x98\xaf\xe9\xad\x8f\xe7\x9c\x80\xe6\x8b\xa9\n\xe6\x88\x91\xe5\x9c\xa8 tarena\n'
>>> f.read()  # 当到达文件尾部,返回空
b''
>>> f.close()
>>> f = open('mynote.txt', 'r')
>>> f.read()
'我是魏眀择\n我在 tarena\n'
>>> f.close()

>>> f = open('mynote.txt', 'r')
>>> f.readline()  # 返回一行
'我是魏眀择\n'
>>> f.readline()
'我在 tarena\n'
>>> f.readline()
''
>>> f.close()

>>> f = open('mynote.txt', 'r')
>>> f.readlines()  # 取出所有的行数据,返回列表
['我是魏眀择\n', '我在 tarena\n']
>>> f.close()

写数据

>>> f = open('python.log', 'w')  # 以字符串方式写文件, 如果文件文件不存在回新建一个文件
>>> f.write('该吃饭了')
4
>>> f.write('!')
1
>>> f.write('\n')  # 写一个换行
1
>>> f.write('下课')
2
>>> f.close()

with 语句

通过with 语句打开文件,with 语句结束,则文件会自动关闭

sys模块

os 模块

文档: https://docs.python.org/zh-cn/3/library/os.html

>>> import os
>>> os.getcwd()  # 返回当前的工作路径,pwd
'/root/桌面/py02/day03_code'
>>> os.mkdir('/tmp/nsd21xx')   # mkdir /tmp/nsd21xx
>>> os.makedirs('/tmp/nsd21xx/a/b/c')  # mkdir -p /tmp/nsd21xx/a/b/c
>>> os.listdir()  # ls
['mygames.py', '.idea', 'mynote.txt', 'python.log', 'mynote2.txt', '03_file_seek.py', '04_myprog.py', '05_cp.py', '01_read_text_file_by_string.py', '02_read_text_file_by_bytes.py']
>>> os.listdir('/tmp')  # ls /tmp  # 列出所有的文件夹
[ 'nsd21xx', 'dir1', 'dir2']
>>> os.chdir('/tmp/nsd21xx')  # cd  /tmp/nsd21xx
>>> os.getcwd()   # pwd
'/tmp/nsd21xx'
>>> os.symlink('/etc/passwd', '/tmp/abc')  # ln -s /etc/passwd /tmp/abc
>>> os.mknod('/tmp/myfile.txt')    # touch /tmp/myfile.txt
>>> os.chmod('/tmp/myfile.txt', 0o755)  # chmod 755 /tmp/myfile.txt
>>> os.rename('/tmp/myfile.txt', '/tmp/a.txt')  # mv /tmp/myfile.txt /tmp/a.txt
>>> os.rmdir('/tmp/dir2')   # rmdir /tmp/dir2
>>> os.remove('/tmp/a.txt')  # rm /tmp/a.txt

os.path 模块

用于路径的操作的模块

>>> import os
>>> os.path.isabs('/root/abc.txt')   # 判断是否为绝对路径
True
>>> os.path.isdir('/tmp/nsd21xx')    # 判断是否是文件夹
True
>>> os.mknod('/tmp/b.txt')   # touch /tmp/b.txt
>>> os.path.isfile('/tmp/b.txt')     # 判断是否是文件
True
>>> os.path.islink('/tmp/abc')      # 判断是否是软连接?
True
>>> os.path.ismount('/home')       # 存在并且是挂载点
True
>>> os.path.exists('/root')       # 判断文件或文件夹是否存在
True
>>> os.path.basename('/tmp/nsd21xx/hello.py')  # 返回文件名
'hello.py'
>>> os.path.dirname('/tmp/nsd21xx/hello.py')  # 返回路径
'/tmp/nsd21xx'
>>> os.path.split('/tmp/nsd21xx/hello.py')  # 拆分 路径和文件名
('/tmp/nsd21xx', 'hello.py')
>>> os.path.join('/tmp/nsd21xx', 'world.py')  # 拼接路径
'/tmp/nsd21xx/world.py'

os.walk() 函数

遍历文件夹

[root@localhost tmp]# tree /tmp/nsd21xx/
/tmp/nsd21xx/
├── a
│ ├── aaa.txt
│ └── b
│ ├── bbb.txt
│ └── c
└── aa
└── bb
└── cc

示例

>>> for x in os.walk('/tmp/nsd21xx'):
...    print(x)
... 
#  (路径 , 路径内的所有文件夹列表 , 路径内的所有文件列表)
('/tmp/nsd21xx', ['a', 'aa'], [])
('/tmp/nsd21xx/a', ['b'], ['aaa.txt'])
('/tmp/nsd21xx/a/b', ['c'], ['bbb.txt'])
('/tmp/nsd21xx/a/b/c', [], [])
('/tmp/nsd21xx/aa', ['bb'], [])
('/tmp/nsd21xx/aa/bb', ['cc'], [])
('/tmp/nsd21xx/aa/bb/cc', [], [])

shutil 模块

文档: https://docs.python.org/zh-cn/3/library/shutil.html

>>> import shutil
>>> f1 = open('/etc/passwd', 'rb')
>>> f2 = open('/tmp/mypass.txt', 'wb')
>>> shutil.copyfileobj(f1, f2)
>>> f1.close()
>>> f2.close()
>>> 
>>> shutil.copy('/etc/passwd', '/tmp/mypass2.txt')    # cp /etc/passwd /tmp/mypass2.txt
'/tmp/mypass2.txt'
>>> shutil.copytree('/root/桌面/py02/day03_code', '/tmp/mycode')  # cp -r     /root/桌面/py02/day03_code /tmp/mycode
'/tmp/mycode'
>>> shutil.move('/tmp/mypass.txt', '/tmp/nsd21xx/a.txt')  # mv /tmp/mypass.txt /tmp/nsd21xx/a.txt
>>> shutil.rmtree('/tmp/mycode')  # rm -rf /tmp/mycode
>>> shutil.chown('/tmp/mypass.txt', user='xxx', group='yyy')  # 改属主属组

生成器

生成器是在程序运行时生成数据,与容器不同,它通常不会在内存中保留大量的数据,而是现用现生成。

生成器可以用算法动态的生成数据

生成器有两种

  1. 生成器函数
  2. 生成器表达式

生成器函数

含有yield 语句的函数 是生成器函数,此函数调用回返回一个生成器对象,生成器也是可迭代对象

yield 语句的语法

yield 表达式

生成器函数示例:

# 定义一个生成器函数, 有 yield 的函数调用后回返回生成器对象
def myrange(stop):
    i = 0
    while i < stop:
        yield i    # 为 遍历次生产器的for 语句提供数据
        i += 1

for x in myrange(5):
print('x=', x)

生成器表达式

( 表达式 for 变量 in 可迭代对象 [if 真值表达式])

[] 内容代表可以省略

>>> [x ** 2 for x in range(1, 5)] # 列表解析(列表推导式)
[1, 4, 9, 16]
>>>
>>> (x ** 2 for x in range(1, 5)) # 生成器表达式
<generator object <genexpr> at 0x7f41dcd30a40>
>>> for y in (x ** 2 for x in range(1, 5)):
... print(y)
...
1
4
9
16

上一篇下一篇

猜你喜欢

热点阅读