python学习笔记03

文件操作,集合,深浅拷贝

一. 文件操作

1. 基本读写文件的方式

1
2
3
4
5
6
7
8
9
10
# open第一个参数是文件名(也可以是一个路径),如果文件存在则打开存在文件,不存在则新建文件,第二个为打开方式,之后会一一介绍各种打开方式,最后一个参数为编码方式
f = open('MyTxt', 'w', encoding='utf8') # w写模式,会清空文件内容,写的基础是什么内容也没有
f.write('''无题·昨夜星辰昨夜风
作者:李商隐
昨夜星辰昨夜风,画楼西畔桂堂东。
身无彩凤双飞翼,心有灵犀一点通。
隔座送钩春酒暖,分曹射覆蜡灯红。
嗟余听鼓应官去,走马兰台类转蓬。''') # 将hiatao字符串写入文件
f.close() # 每一次打开一个文件,操作完成后要关闭,否则会有意想不到的错误
-----------------------------------------------------------------------------------------------------------------

文件的读和写操作通过文件中的光标来定位,从而知道该从哪里写,从哪里读。首先介绍一下相应的方法
f.tell() # 返回光标当前位置,一个英文字符占一个,中文占三个(标准,是编码的关系)
f.seek(4) # 调整光标位置,这里表示到第四个字节的位置
f.truncate(10) # 截断,打开方式应该为’a’,表示从第十个字节之后的都删除,只保留前十个字节

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
-----------------------------------------------------------------------------------------------------------------
# 以读的方式打开文件
f = open('MyTxt', 'r', encoding='utf8')
print(f.read(4)) # f.read(4)读取前四个字符,一个汉字为一个字符。执行完成后,光标指向第五个字符
# 执行结果:无题·昨
print(f.readline()) # f.readline()读取一行,因为上一条语句已经读取四个字符,文件内读指针已经指到第五个字符,所以这里读取了这一行剩下的字符,执行完成后光标--指向第二行第一个字符
# 执行结果:夜星辰昨夜风
print(f.readlines()) #f.readlines() 读取每一行字符,返回一个列表
# 执行结果:['作者:李商隐\n', '昨夜星辰昨夜风,画楼西畔桂堂东。\n', '身无彩凤双飞翼,心有灵犀一点通。\n', '隔座送钩春酒暖,分曹射覆蜡灯红。\n', '嗟余听鼓应官去,走马兰台类转蓬。']
f.close()
------------------------------------------------------------------------------------------------------------------
# 以读的类型打开文件
f = open('MyTxt', 'r', encoding='utf8')
for i in f: # 跟for i in f.readlines 不一样,for循环内部做成一个迭代器(用一个取一个)
print(i.strip()+" ") # i打印完就没了,不在程序中
f.close()
# 程序执行结果:就是将内容原封不动的打印出来。
# 迭代器之后会涉及到。
--------------------------------------------------------------------------------------------------------------------
# 以追加的方式打开文件,
f = open('MyTxt', 'a', encoding='utf8')
f.write('哈哈哈') # 在文件的末尾添加该字符串
f.close()
---------------------------------------------------------------------------------------------------------------------
# r+读写模式(使用最多),w+写读模式(清空,写从头写,读的时候也从头读。。但是我失败了。。),a+追加读
f = open('MyTxt','r+',encoding='utf8') # 读该怎么读怎么读,写就在最后写(除非之前指定位置),写和读用的两组光标
print(f.read(1)) # 读取第一个字符
f.write('哈哈') # 在文件的末尾加入字符串
# ----获取特定的字符
for j,i in enumerate(f.readlines()): # enumerate() 函数,返回一个列表,每个列表元素为一个二维元组
if i.startswith('身') : # 如果该行以’身‘开头,那么进行操作。。
i = ''.join([i.strip(),'zhangjitao'])
print(i.strip(),j)
# ----
f.close()

2. 读写文件的基本操作

1
2
3
print(f.fileno())      # 每打开一个文件都会有一个唯一的编号
print(f.isatty()) # 查看是否为真正的终端设备
print(f.readable()) # 是否可读

3. 读写文件的缓存问题

在我们向文件中写东西的时候,如果没有执行到f.close(),则已经写的内容不会出现在文件中
通过f.flush()将内容压入

1
2
3
4
5
6
7
8
9
10
11
import time
f = open('MyTxt', 'a', encoding='utf8')
f.write('zhangjitao')
time.sleep(20) # 执行完写的语句,等待20秒后才真正写入文件
f.close()
---------------------------------
f = open('MyTxt', 'a', encoding='utf8')
f.write('zhangjitao')
f.flush() # 直接将缓存中的内容写入硬盘
time.sleep(20) # #执行完写的语句,等待20秒后才真正写入文件
f.close()

实例

1
2
3
4
5
import sys,time
for i in range(30):
sys.stdout.write("*") # 只是放到缓存,到最后一次打印:******************************
sys.stdout.flush() # sys.stdout为一个文件对象。先将该语句注释,之后再取消注释,查看效果。。就懂了。。
time.sleep(1)

4. 修改已有文件内容

一般不直接在源文件之中修改,而是在查询需要修改的内容的过程中将源文件拷贝到新文件中同时修改。

1
2
3
4
5
6
7
8
f = open('1', 'r+', encoding='utf-8')
f2 = open('2', 'w', encoding='utf-8')
for i in f:
if i.startswith('画'):
i = ''.join([i.strip(), 'hhhh\n'])
f2.write(i) # 将修改过后或者没有修改的内容写入新文件。。
f2.close()
f.close()

5. 另一种格式

1
2
3
4
5
# with打开文件省去close()
with open('','') as f: #相当于open()。。。。。。close()
f.readline()
f.write()
with open() as f,open() as f2: #打开两个文件

二. 深浅拷贝

个人理解,指的是:我是只拷贝了你一个地址还是拷贝了你的所有内容。。这又涉及到可变类型和不可变类型了
不再细讲,之后有时间另开一节细讲。

1
2
import copy     # 在copy模块中有一个方法deepcopy()能够深拷贝,。
copy.deepcopy()

三. 集合(一个数学工具)离散数学学过的。。

在程序中的作用:1.去重, 2.关系测试,3.交集,并集,子集,超集

集合的特性:

  1. 集合的对象必须是可哈希的,可以作字典的健
  2. set是无序的,且不可重复,可变集合
  3. 但是集合本身不可哈希
  4. 不可变集合frozenset
  5. 通过in和not in 判断元素是否在集合里面

1. 创建

1
2
3
4
s = set('alex li')      # 有重复的保留一个
print(s) # 执行结果: {' ', 'a', 'i', 'x', 'e', 'l'}
s1 = ['zhang', 'ji', 'zhang'] # 一个列表
print(set(s1)) # 执行结果:{'ji', 'zhang'}

2. 更新

1
2
3
4
5
6
7
8
9
10
11
12
13
li = [1, 2, 'zhangjitao']

s = set(li)

print(s) # 执行结果:{1, 2, 'zhangjitao'}

s.add('haitao') # 作为一个元素添加

print(s) # 执行结果:{1, 2, 'zhangjitao', 'haitao'}
s.update('ops') # 作为一个序列添加
print(s) # 执行结果:{1, 2, 'zhangjitao', 'haitao', 's', 'p', 'o'}
s.update([12, 'eee'])
print(s) # 执行结果:{1, 2, 'zhangjitao', 'haitao', 12, 's', 'p', 'eee', 'o'}

3. 删除

1
2
3
4
5
s.remove(2)
print(s) # 执行结果:{1, 'haitao', 'eee', 12, 'p', 'zhangjitao', 's', 'o'}
s.pop() #随机删除
print(s) # 执行结果:{'haitao', 'eee', 12, 'p', 'zhangjitao', 's', 'o'}
s.clear() # 清除

4. 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
print(set('zhang') < set('zhangjit'))     # 包含关系,子集,
# 执行结果:True
a = set([1, 2, 3, 4, 5])
b = set([4, 5, 6, 7, 8])

c = a.intersection(b) # 取交集:a&b
print(c)
# 执行结果:{4, 5}
d = a.union(b) # 取并集:a|b
print(d)
# 执行结果:{1, 2, 3, 4, 5, 6, 7, 8}
e = a.difference(b) # 取差集,a里面有,b里面没有 :a-b
print(e)
# 执行结果:{1, 2, 3}
f = a.difference(b).union(b.difference(a))
g = a.symmetric_difference(b) # 取对称差集 :a^b
print(g)
# 执行结果:{1, 2, 3, 6, 7, 8}
# 父集,和子集
h = a.issuperset(b) # 父集 >

k = a.issubset(b) # 子集 <

print(k)
# 执行结果:False
0%