Python运维开发:04 Python集合和文件
集合
- 类似于 所有元素均为不可变且无重复元素的list
- 与list区别:元素不重复,元素数据类型,元素是无序
定义
>> names = {'xue', 'wang', 'zhang'}
>>> names
{'xue', 'zhang', 'wang'}
- 使用大括号包含
- 每个元素之间使用逗号分隔
- 只能包含不可变数据类型
遍历集合
- 使用for访问集合中所有的元素
>>> for name in names: ... print(name) ... xue zhang wang
类型转换
- 可以通过函数set将其他可遍历的类型转化为集合
>>> set('abcabcd')
{'c', 'd', 'a', 'b'}
>>> type(set('abcabcd'))
<class 'set'>
>>> set([1, 2, 3, 4, 5])
{1, 2, 3, 4, 5}
>>> set((1, 2, 3, 4, 5))
{1, 2, 3, 4, 5}
集合常见操作
- 获取set元素的数量
>>> names
{'xue', 'zhang', 'wang'}
>>> type(names)
<class 'set'>
>>> len(names)
3
- 获取set中元素最大值、最小值
>>> max(names) 'zhang' >>> min(names) 'wang'
- 判断元素是否在set中存储
>>> 'xue' in names True >>> 'pc' not in names True
集合运算
- 并集:|
- 交集:&
- 差集:-
- 对差集:^
>>> names_1 = {'xue', 'liu', 'wang'}
>>> names_2 = {'xue', 'zhang', 'zhao'}
>>> names_1 | names_2
{'liu', 'zhang', 'xue', 'zhao', 'wang'}
>>> names_1 & names_2
{'xue'}
>>> names_1 - names_2
{'liu', 'wang'}
>>> names_1 ^ names_2
{'liu', 'wang', 'zhang', 'zhao'}
练习
1、获取两个list中相同的元素到第三个列表中,保证结果中元素不重复
nums_1 = [1, 2, 3, 4, 5, 3, 10, 11]
nums_2 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34]
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Auth : xuegqcto@aliyun.com ''' 获取两个list中相同的元素到第三个列表中,保证结果中元素不重复 nums_1 = [1, 2, 3, 4, 5, 3, 10, 11] nums_2 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34] ''' nums_1 = [1, 2, 3, 4, 5, 3, 10, 11] nums_2 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34] nums_3 = [] set_jiao = (set(nums_1) & set(nums_2)) print(set_jiao) nums_3 = list(set_jiao) print(nums_3)
集合函数
dir+help

文件
自己在电脑上打开word文件的操作顺序:
- 在计算机盘符中找到对应的文件
- 鼠标双击打开文件(选择查阅的工具)
- 查阅文件内容/编辑文件内容
- 如果有编辑文件内容保存文件
- 关闭文件
打开&关闭文件
- 打开文件
fhandler = open(path, mode, …)
path为文件路径
mode为打开文件方式及文件类型
- 关闭文件
fhandler.close()


读文件
创建文件n.txt
读文件
测试文件不存在时现象
>>> fhandler = open('n.txt')
>>> fhandler.read()
'123456789\n'
>>> fhandler.close()
>>>
>>> fhandler = open('n2.txt)
File "<stdin>", line 1
fhandler = open('n2.txt)
^
SyntaxError: EOL while scanning string literal
- 读文件
fhandler.read() 读取文件所有内容
fhandler.read(size) 读取文件size个字节内容
fhandler.readline() 读取文件一行
fhandler.readlines() 读取文件所有行
- 判断文件是否读取结束
1)根据读取结果是否为空字符('')判断
2)文本使用''(str), 二进制使用b''(bytes)
- 文件可遍历性
>>> fhandler = open('t1.txt')
>>> for line in fhandler:
... print(line)
...
hello
world
123
456
78901234
写文件( 覆盖)
- 写入文件
>>> fhandler = open('n.txt', 'w')
>>> fhandler.write('abcdefghijklmn')
14
>>> fhandler.close()
- 测试写入数字、boolean、list、tuple现象
>>> fhandler = open('n2.txt', 'w')
>>> fhandler.write([1,2,3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not list
>>> fhandler.write(True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not bool
>>> fhandler.write((1, 2, 3))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not tuple
>>> fhandler.close()
- 测试文件不存在时现象【如果文件不存在,则创建】
- 测试文件存在时现象【如果文件存在,则清空文件内容】
- 测试文件内容什么时候保存到硬盘中(close前后)【执行 fhandler.write('hello')后,原文件将被自动清空,执行fhandler.close() 文件内容保存到硬盘中】
写文件
- 写文件
fhandler.write () 写入字符串
fhandler.writelines() 写入多个字符串( 字符串组成的序列)
- flush内存数据到硬盘
fhandler.flush()
>>> fhandler = open('n2.txt', 'w')
>>> fhandler.write('abcdef')
6
>>> fhandler.writelines(["name", "age"])
>>> fhandler.flush() //n2.txt 内容为abcdefnameage
>>> fhandler.close()
写文件( 创建并写)
- 写文件
>>> fhandler.close()
>>> fhandler = open('n1.txt', 'x')
>>> fhandler.write('123')
- 测试文件不存在时现象【文件不存在,则在open时,创建文件】
- 测试文件存在时现象【报错,提示文件已经存在】
>>> fhandler = open('n1.txt', 'x')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileExistsError: [Errno 17] File exists: 'n1.txt'
写文件( 追加)
- 写文件
>>> fhandler = open('n.txt','at')
>>> fhandler.write('1234567890')
10
>>> fhandler.close()
>>> fhandler = open('n.txt','at')
>>> fhandler.write('abcde')
5
n.txt现在的内容:1234567890abcde
测试文件不存在时现象【如果文件不存在,则创建】
测试文件存在时现象【如果文件存在,那么新增内容到行尾】
文件指针
记录文件中的操作位置
- 获取文件指针位置:
fhandler.tell()
- 设置文件指针位置:
fhandler.tell(cookie, whence)
cookie为相对whence移动的偏移量

tell
>>> fhandler = open('n1.txt', 'r')
>>> fhandler.tell()
0
>>> fhandler.read(2)
'12'
>>> fhandler.tell()
2
>>> fhandler.read()
'34567890'
>>> fhandler.tell()
10
>>> fhandler.read()
''
seek
>>> fhandler.tell() 10 >>> fhandler.read() '' >>> fhandler.seek(0) 0 >>> fhandler.read() '1234567890'
读写文件
- 读写文件
>>> fhandler = open('n.txt', 'r+')
>>> fhandler.read()
'1234567890'
>>> fhandler.seek(5)
5
>>> fhandler.write('===')
3
>>> fhandler.tell()
8
>>> fhandler.seek(0)
0
>>> fhandler.read()
'12345===90'
- 测试文件存在时现象
【如果文件存在,可以执行读和写,2个情况】
tell值在末尾,将在末尾写入
tell值在开头,将覆盖写入,如:ab345===90
>>> fhandler = open('n.txt', 'r+')
>>> fhandler.write('ab')
2
>>> fhandler.read()
'345===90'
>>> fhandler.seek(0)
0
>>> fhandler.read()
'ab345===90'
- 测试文件不存在时现象【如果文件不存在,则报错:FileNotFoundError: [Errno 2] No such file or directory: 'n1.txt'】
写读文件
- 写读文件
>>> fhandler = open('n.txt', 'w+')
>>> fhandler.read()
''
>>> fhandler.write('1234567890')
10
>>> fhandler.read()
''
>>> fhandler.seek(0)
0
>>> fhandler.read()
'1234567890'
- 测试文件存在时现象【如果文件存在,open时清空文件内容】
- 测试文件不存在时现象【如果文件不存在,则创建】
追加读文件
- 追加读文件
>>> fhandler = open('n1.txt', 'a+')
>>> fhandler.read()
''
>>> fhandler.tell()
10
>>> fhandler.seek(0)
0
>>> fhandler.read()
'1234567890'
>>> fhandler.write('*****')
5
>>> fhandler.seek(0)
0
>>> fhandler.read()
'1234567890*****'
- 测试文件存在时现象【如果文件存在,那么新增内容到行尾】
- 测试文件不存在时现象【如果文件不存在,则创建】
- 测试文件写入位置
【open文件后,将默认定位文件位置到末尾,所有read为空】
open函数返回的对象
文本类型:<class '_io.TextIOWrapper'>
二进制类型:<class '_io.BufferedWriter'>
练习
copy文件(以二进制方式拷贝)
如果copy文件为5G呢?
浙公网安备 33010602011771号