1 # 打开文件
2 open("yesterday")
3
4
5 # 读取文件的内容
6 data = open("yesterday", encoding = "utf-8").read() # 不指定编码表,会用默认编码表.万一和文件所用编码表不一致,会乱码. 最好指定编码表.
7 print(data)
8
9
10 # 要对文件进行更多操作,需要将其封装成一个对象
11 f = open("yesterday","r",encoding = "utf-8") # 文件句柄. .r代表可读的, 这种方式是打开一个文件>
12 f1 = open("yesterday_copy","w",encoding = "utf-8") # w代表可写的,这样其实是创建一个文件. 若文件已存在,里面内容会被覆盖.
13 data = f.read()
14 data2 = f.read()
15 print(data)
16 print("=================")
17 print(data2) # 打出来为空.因为data读完后指针已经到了文件的最后面,再读data2是接着往下读的, 后面没有内容, 所以data2为空.
18
19
20 # 写, 原文件内容被覆盖
21 f.write("我爱北京天安门") # 默认文件是读模式,要先打开,才能写.
22 f1.write("我爱北京天安门,\n")
23 f1.write("天安门上太阳升") # 写出来的两行会换行
24
25 # 追加, 在原文件基础上追加
26 f2 = open("yesterday_copy","a",encoding = "utf-8") # a 代表append追加. a 不能读,只能写, 不过不会覆盖原来的文件内容.
27 f2.write("天安门上太阳升.....")
28
29 f.close()
30 f1.close()
31 f2.close()
32
33
34 # 读指定行数的文件内容
35 print(f.readline()) # 读一行
36
37 # 读五行
38 for i in range(5):
39 print(f.readline())
40
41
42
43 # 循环读文件并打印
44 for line in f.readline():
45 print(line)
46
47
48 # 循环读文件并打印,第十行不打印. 方法1
49 for index, line1 in enumerate(f.readline()):
50 if index == 9:
51 print("==============我是分割线==========")
52 continue
53 print(line1.strip())
54
55
56 # 循环读文件并打印,第十行不打印. 方法2
57 count=0
58 for line in f:
59 if count==9:
60 print("===========我是分割线===========")
61 count += 1
62 continue
63 print(line) # 一行行读,且内存一次只保存一行
64 count+=1
65
66
67 # 读完文件把指针移到前面
68 print(f.tell()) # 返回当前文件指针位置 (若是0,代表指针在文件开头). 指针不是按行数计数的, 是按字符数量来计数的.
69 print(f.read(5)) # 读5个字符
70 f.seek(0) # 把指针调回到文件最开始的位置. 不是所有的文件都可以这么移.seekable()方法判断一个文件是否可移
71
72
73 # 打印文件的编码表
74 print(f.encoding)
75
76
77 # 返回文件在内存中的编号
78 print(f.fileno())
79
80
81 # flush 刷新内存中的数据到文件或硬盘
82 print(f.flush())
83
84
85 # 判断文件是否关闭
86 print(f.closed)
87
88
89 # 截断文件
90 f3 = open("yesterday_copy","a",encoding = "utf-8") # 模式必须是a(append)
91 f3.truncate() # 什么都不写,就是清空文件
92 f3.truncate(10) # 从文件开头截取10个字符
93
94
95
96 # 模仿进度条
97 import sys, time
98
99 for i in range(50):
100 sys.stdout.write("#")
101 sys.stdout.flush() # 一点点打印出来, 类似进度条. 若不加flush()方法, 会一下子打印出来所有的#,就不像进度条了.
102 time.sleep(1) # 每打一次休息一秒
103
104
105
106 # 读写文件 r+ 模式
107 f4 = open("yesterday_copy","r+",encoding = "utf-8")
108 print(f4.readline())
109 print(f4.readline())
110 print(f4.readline())
111 f4.write("===========test=========") # 写的时候是从最后面开始追加. 不论此时读到第几行(不论指针是哪里)
112 print(f4.readline())
113 f4.close()
114
115
116 # 写读 w+ 模式
117 f5 = open("yesterday_copy2","w+",encoding = "utf-8")
118 print(f5.readline()) # 没有读到内容,因为文件刚刚创建是空的.
119 print(f5.readline())
120 print(f5.readline())
121 print(f5.tell())
122 f5.write("=========test============") # 写读模式是先创建一个文件, 再写内容. 写的内容会覆盖掉后面的内容,.
123 print(f5.readline())
124 f5.close()
125
126
127 # 二进制读取 rb 模式
128 f6 = open("yesterday_copy2","rb") # 二进制不能传encoding参数
129 print(f6.readline())
130 f6.close()
131
132 # 什么情况会用rb 模式?
133 # 1. 网络传输时会用到. 网络传输(即使是字符串)只能用rb模式.
134 # 2. 迅雷等下载的文件是二进制文件.
135
136
137 # 二进制写 wb 模式
138 f7 = open("yesterday_copy2","wb") # 二进制不能传encoding参数
139 f7.write("hello binary\n") # 字符串写不进去. 要用bytes写.
140 f7.write("hello binary\n".encode()) # 字符串转换成二进制
1 # 实现边读边写(写的过程中可以修改,写到一个新的文件中去)
2 f = open('yesterday2',"r",encoding="utf-8")
3 f_new = open('yesterday2.bak',"w",encoding="utf-8") # 在内存中修改,改好再写出去
4
5 '''
6 for line in f:
7 if"肆意的快乐等我享受" in line:
8 line = line.replace("肆意的快乐等我享受","肆意的快乐等alex享受")
9 f_new.write(line)
10 else:
11 f_new.write(line)
12 '''
13
14 # 优化后代码
15 for line in f:
16 if"肆意的快乐等我享受" in line:
17 line = line.replace("肆意的快乐等我享受","肆意的快乐等alex享受")
18 f_new.write(line)
1 # 引用参数
2 import sys
3 f = open('yesterday2',"r",encoding="utf-8")
4 f_new = open('yesterday2.bak',"w",encoding="utf-8") # 在内存中修改,改好再写出去
5
6 find_str = sys.argv[1]
7 replace_str = sys.argv[2]
8
9 # 优化后代码
10 for line in f:
11 if find_str in line:
12 line = line.replace(find_str,replace_str)
13 f_new.write(line)
1 # with语句
2 # 为了避免打开文件后忘记关闭,可以通过管理上下文, 实现当with代码块执行完毕时,内部自动关闭并释放文件资源
3 with open('yesterday2','r',encoding='utf-8')as f: # 其它对文件f的操作照常
4 for line in f:
5 print(line)
6
7 # with还支持对多个文件的上下文进行管理
8 with open('yesterday2','r',encoding='utf-8')as f, \
9 open('yesterday2', 'r', encoding='utf-8')as f2:
10
11
12 # python代码规范,一行代码不应超过80个字符
1 def replace(arg1):
2 for line in user_list2.readlines():
3 if name == line.split(',')[0]:
4 line = line.replace(line.split(',')[2], arg1+'\n')
5 temp.write(line)
6 else:
7 temp.write(line)
8
9
10 #TODO r+ /a+说是可读可写,但是下面这段代码, 如果把user_list2改成a+模式, 则文件的数据并没有读取成功.
11 # r+, a+到底是怎么工作的
12
13
14
15 user_list2 = open('user_list2', 'r+', encoding='utf-8')
16 temp = open('temp', 'a+', encoding='utf-8')
17
18 name = input('name')
19 replace('5000')
20
21 user_list2.close()
22 temp.close()