day12

x模式

 1 # x模式(控制文件操作的模式)-》了解
 2 #     x, 只写模式【不可读;不存在则创建,存在则报错】
 3 
 4 # with open('a.txt',mode='x',encoding='utf-8') as f:
 5 #     pass
 6 
 7 # with open('i.txt',mode='x',encoding='utf-8') as f:
 8 #     f.read()
 9 
10 with open('j.txt', mode='x', encoding='utf-8') as f:
11     f.write('哈哈哈\n')

b模式

 1 # 控制文件读写内容的模式
 2 # t:
 3 #     1、读写都是以字符串(unicode)为单位
 4 #     2、只能针对文本文件
 5 #     3、必须指定字符编码,即必须指定encoding参数
 6 # b:binary模式
 7 #     1、读写都是以bytes为单位
 8 #     2、可以针对所有文件
 9 #     3、一定不能指定字符编码,即一定不能指定encoding参数
10 #
11 # 总结:
12 # 1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便
13 # 2、针对非文本文件(如图片、视频、音频等)只能使用b模式
14 
15 
16 # 错误演示:t模式只能读文本文件
17 # with open(r'爱nmlgb的爱情.mp4',mode='rt') as f:
18 #     f.read() # 硬盘的二进制读入内存-》t模式会将读入内存的内容进行decode解码操作
19 
20 
21 #
22 # with open(r'test.jpg',mode='rb',encoding='utf-8') as f:
23 #     res=f.read() # 硬盘的二进制读入内存—>b模式下,不做任何转换,直接读入内存
24 #     print(res) # bytes类型—》当成二进制
25 #     print(type(res))
26 
27 # with open(r'd.txt',mode='rb') as f:
28 #     res=f.read() # utf-8的二进制
29 #     print(res,type(res))
30 #
31 #     print(res.decode('utf-8'))
32 #
33 # with open(r'd.txt',mode='rt',encoding='utf-8') as f:
34 #     res=f.read() # utf-8的二进制->unicode
35 #     print(res)
36 
37 
38 with open(r'e.txt',mode='wb') as f:
39     f.write('你好hello'.encode('utf-8'))
40 
41 with open(r'f.txt',mode='wb') as f:
42     f.write('你好hello'.encode('utf-8'))
43     f.write('哈哈哈'.encode('gbk'))
44 
45 
46 # 文件拷贝工具
47 # src_file=input('源文件路径>>: ').strip()
48 # dst_file=input('源文件路径>>: ').strip()
49 # with open(r'{}'.format(src_file),mode='rb') as f1,\
50 #     open(r'{}'.format(dst_file),mode='wb') as f2:
51 #     # res=f1.read() # 内存占用过大
52 #     # f2.write(res)
53 #
54 #     for line in f1:
55 #         f2.write(line)
56 
57 
58 
59 
60 # 循环读取文件
61 # 方式一:自己控制每次读取的数据的数据量
62 # with open(r'test.jpg',mode='rb') as f:
63 #     while True:
64 #         res=f.read(1024) # 1024
65 #         if len(res) == 0:
66 #             break
67 #         print(len(res))
68 
69 
70 # 方式二:以行为单位读,当一行内容过长时会导致一次性读入内容的数据量过大
71 # with open(r'g.txt',mode='rt',encoding='utf-8') as f:
72 #     for line in f:
73 #         print(len(line),line)
74 
75 # with open(r'g.txt',mode='rb') as f:
76 #     for line in f:
77 #         print(line)
78 
79 # with open(r'test.jpg',mode='rb') as f:
80 #     for line in f:
81 #         print(line)

文件操作的其他方法

 1 # 一:读相关操作
 2 # 1、readline:一次读一行
 3 # with open(r'g.txt',mode='rt',encoding='utf-8') as f:
 4 #     # res1=f.readline()
 5 #     # res2=f.readline()
 6 #     # print(res2)
 7 #
 8 #     while True:
 9 #         line=f.readline()
10 #         if len(line) == 0:
11 #             break
12 #         print(line)
13 
14 # 2、readlines:
15 # with open(r'g.txt',mode='rt',encoding='utf-8') as f:
16 #     res=f.readlines()
17 #     print(res)
18 
19 # 强调:
20 # f.read()与f.readlines()都是将内容一次性读入内存,如果内容过大会导致内存溢出,若还想将内容全读入内存,
21 
22 
23 # 二:写相关操作
24 # f.writelines():
25 with open('h.txt',mode='wt',encoding='utf-8') as f:
26     # f.write('1111\n222\n3333\n')
27 
28     # l=['11111\n','2222','3333',4444]
29     l=['11111\n','2222','3333']
30     # for line in l:
31     #     f.write(line)
32     f.writelines(l)
33 
34 
35 
36 # with open('h.txt', mode='wb') as f:
37 #     l = [
38 #         '1111aaa1\n'.encode('utf-8'),
39 #         '222bb2'.encode('utf-8'),
40 #         '33eee33'.encode('utf-8')
41 #     ]
42 #     f.write(l)
43 #
44 #     # 补充1:如果是纯英文字符,可以直接加前缀b得到bytes类型
45 #     # l = [
46 #     #     b'1111aaa1\n',
47 #     #     b'222bb2',
48 #     #     b'33eee33'
49 #     # ]
50 #
51 #     # 补充2:'上'.encode('utf-8') 等同于bytes('上',encoding='utf-8')
52 #     l = [
53 #         bytes('上啊',encoding='utf-8'),
54 #         bytes('冲呀',encoding='utf-8'),
55 #         bytes('小垃圾们',encoding='utf-8'),
56 #     ]
57 #     f.writelines(l)
58 
59 
60 # 3、flush:
61 # with open('h.txt', mode='wt',encoding='utf-8') as f:
62 #     f.write('哈')
63 #     # f.flush()
64 
65 
66 # 4、了解
67 with open('h.txt', mode='wt', encoding='utf-8') as f:
68     print(f.readable())
69     print(f.writable())
70     print(f.encoding)
71     print(f.name)
72 
73 print(f.closed)

文件的高级操作:控制文件指针的移动

 1 # 指针移动的单位都是以bytes/字节为单位
 2 # 只有一种情况特殊:
 3 #       t模式下的read(n),n代表的是字符个数
 4 
 5 with open('aaa.txt',mode='rt',encoding='utf-8') as f:
 6     res=f.read(4)
 7     print(res)
 8 
 9 # # f.seek(n,模式):n指的是移动的字节个数
10 # # 模式:
11 # # 模式0:参照物是文件开头位置
12 # f.seek(9,0)
13 # f.seek(3,0) # 3
14 #
15 # # 模式1:参照物是当前指针所在位置
16 # f.seek(9,1)
17 # f.seek(3,1) # 12
18 #
19 # # 模式2:参照物是文件末尾位置,应该倒着移动
20 # f.seek(-9,2) # 3
21 # f.seek(-3,2) # 9
22 #
23 # # 强调:只有0模式可以在t下使用,1、2必须在b模式下用
24 #
25 # f.tell() # 获取文件指针当前位置
26 
27 # 示范
28 with open('aaa.txt',mode='rb') as f:
29     f.seek(9,0)
30     f.seek(3,0) # 3
31     # print(f.tell())
32     f.seek(4,0)
33     res=f.read()
34     # print(res.decode('utf-8'))
35 
36 
37 
38 with open('aaa.txt',mode='rb') as f:
39     f.seek(9,1)
40     f.seek(3,1) # 12
41     print(f.tell())
42 
43 
44 with open('aaa.txt',mode='rb') as f:
45     f.seek(-9,2)
46     # print(f.tell())
47     f.seek(-3,2)
48     # print(f.tell())
49     print(f.read().decode('utf-8'))

 

posted @ 2021-09-18 15:04  likl-  阅读(36)  评论(0)    收藏  举报