2 #date: 17/10/5
3 import time ,sys
4 #练习文件的操作
5 #实现三级菜单
6 #今天任务
7
8 #能调用方法的一定是对象
9 ##三种基本的操作模式 r(只可读) w(只可写) a(追加)
10 #一般步骤:创建文件对象 --->调用文件方法操作 ------>关闭文件
11 #===========读
12 #file = open('1','r',encoding = 'utf8')#返回的是一个文件对象
13 #re = file.read(5) #可以指定要读几个字符
14 #file.write('哈哈哈哈') #注意这里会报错,读只能读,不能写
15 #print(re)
16 #file.close()
17
18
19 #===========写
20 # file = open('1','w',encoding = 'utf8')#<class '_io.TextIOWrapper'>
21 # #file.write('五星红旗我为你自豪') #首先会做一个清空的操作,然后把你要写的内容写入文件中
22 # file.read()#这里会报错,因为写只能写不能再去读
23 # file.close()
24
25
26 #如果文件没有关闭,数据会被缓存下来,不会写入磁盘中
27 # file = open('1','w',encoding='utf8')
28 # file.write('开心快乐每一天')
29 # time.sleep(30)
30 # file.close()
31
32
33 #================具体的操作方法
34 #f = open('1','r',encoding='utf8')
35 # print(f.read(2))
36 # print(f.read(2)) #注意 :汉字在这里占一个单位(in Py3)
37 # print(f.readline())
38 # print(f.readline())
39 # print(f.readline())#从光标位置开始读一行,无论是read还是readline/readdlines光标的位置都会发生变化
40 # print(f.readlines())#返回一个列表,列表包含了文件的每一行内容,并且有换行符
41 # #['开心快乐每一天3\n', '开心快乐每一天4\n', '开心快乐每一天5\n', '开心快乐每一天6']
42 # f.close()
43
44
45 #=================通过循环逐行读取文件内容
46 # data = f.readlines()
47 #number = 0
48 # for i in data:
49 # number += 1
50 # if number == 5:
51 # i = ''.join([i.strip(),'handle\n'])
52 # print(i.strip())
53 # f.close()
54 ##########对于大数据文件,要用以下方式(the best way):
55 # number = 0
56 # for file_content in f:#解释:这是for内部将f做成一个迭代器,用一行取一行
57 # number += 1
58 # if number == 5:
59 # file_content = ''.join([file_content.strip(),'handle\n'])#取代万恶的+
60 # print(file_content.strip())
61 # f.close()
62
63 #=====基本操作
64 # print(f.tell()) #0 作用:获取当前光标所在位置 *
65 # print(f.read(2)) #开心
66 # print(f.tell()) #返回6 一个中文3个字节在utf8中
67 # print(f.read(2)) #快乐
68 # print(f.tell()) #12
69 # print(f.seek(0)) #移动光标到指定的位置 *
70 # print(f.tell())
71 # print(f.read(2))
72
73
74 #==========进度条的实例
75 #flush 作用把缓存里面的数据转移到磁盘上,可以用它做进度条
76 #sys.stdout 作用可以在终端上显示某个内容
77 #不加flush的时候:*并没有直接放入内存,而是放入缓冲区,暂时看不到,刷新完才能看,30个全放完结束了,一次性给用户看
78 #终端也是文件对象,
79 #
80 # for i in range(30):
81 # sys.stdout.write("*") #如果不加flush,他是一个一个把*放入缓冲中,直到全部放完,他才把他们放入磁盘中
82 # sys.stdout.flush()#进入缓冲区立刻更新,放一个更新一个,不等你全部放完
83 # time.sleep(0.2)
84 # f.close()
85
86
87 #=======
88 # f = open('1','w',encoding='utf8')
89 # #truncate() 截断数据,不能再r模式下 ,默认不加参数是从开头一直截取
90 # #在w模式下:先清空,再写,再截断 (没有意义)
91 # #在a模式下:直接将指定位置后的内容截断
92 # f.truncate(9)#如果是中文的话默认3个字节,他会把前两个字符保留,之后的内容截断
93 # f.write('hello world')
94 # f.truncate(5)
95 # f.write('11hello world')
96 #
97 # f.close()
98
99 #======r+ w+ a+
100 #fileno 文件描述符,整数唯一
101
102 #a+ 光标默认在最后位置,开始写
103 #w+ 先清空,再写读
104 #f = open('1','r+',encoding='utf8')
105
106 #------验证r+模式
107 #r+ 光标默认在第0个位置,但是是在最后位置开始写
108 #f = open('1','r+',encoding='utf8')
109 #print(f.tell())
110 #print(f.readline())
111 # f.write('ccckk')
112
113 #------验证w+模式
114 #w+ 先清空,再写读
115 # f = open('1','w+',encoding='utf8')
116 # print(f.readline()) #因为先清空了,所以没有内容
117 # print(f.tell())# 0
118 # print(f.write('阿帕帕')) #开始写入
119 # print(f.tell()) #光标移动到了最后
120 # #print(f.seek(0)) #所以想看到就移动光标到开始位置
121 # print(f.readline()) #所以在读取还是没有
122
123 #------验证a+模式
124 #a+ 光标默认在最后位置,开始写
125 #f = open('1','a+',encoding='utf8')
126 #print(f.tell()) #217
127 #print(f.readline())#读不到,因为光标在最后
128 #f.write('ccckk')
129
130
131 #-----终极问题如何修改:只能采取重新创建一个文件的思路
132 #例子:将第5行最后面追加个hello
133 #方法一:
134 # f_read = open('1','r',encoding='utf8')
135 # f_write = open('2','w',encoding='utf8')
136 # num = 0;
137 # for i in f_read:
138 # num +=1
139 # if num == 5:
140 # i = ''.join([i.strip(),'hello\n'])
141 # f_write.write(i)
142 # f_read.close()
143 # f_write.close()
144
145 #方法二 with 方法 同时管理多个文件对象(推荐使用这种,不用我们手动关闭文件了)
146 num = 0;
147 with open('1','r',encoding='utf8') as r, open('2','w',encoding='utf8') as w :
148 for i in r:
149 num +=1
150 if num == 5:
151 i = ''.join([i.strip(),'hello_girl\n'])
152 w.write(i)