互联网架构运维、Python运维开发

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文件的操作顺序:

  1. 在计算机盘符中找到对应的文件
  2. 鼠标双击打开文件(选择查阅的工具)
  3. 查阅文件内容/编辑文件内容
  4. 如果有编辑文件内容保存文件
  5. 关闭文件

 打开&关闭文件

  • 打开文件

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呢?

 

 

posted on 2019-01-04 17:27  xuegqcto  阅读(139)  评论(0)    收藏  举报

导航