day03-文件操作

 

1、对文件操作流程

  • 打开文件,得到文件句柄赋值给一个变量
  • 通过文件句柄,对文件进行操作
  • 关闭文件

格式:

#获取文件句柄

f = open("yesterday","r",encoding="utf-8")

#读取数据

data = f.read()

#打印读取的文件

print(data)

#关闭文件

f.close()

2、read、readline、readlines对比

f.read()会读取文件的所有内容,光标也会移动到最后位置

f.readline()会读取文件的第一行,光标会移动到第一行最后位置

f.readlines()以列表的形式,显示整个文档,每行作为一个元素。光标也会移到最后

 

3、r读模式,仅仅只能读,读全部

1 #data = open("yesterday").read()
2 f = open("yesterday",'r')  #文件句柄,包含文件的文件名,字符集,大小,在硬盘上的位置
3 data = f.read() #文件的读取是从第一行开始,会读取整个文件
4 data2= f.read()  #再次读取时,是接着上次的读取结束位置
5 print(data)
6 print("----------------------------------")
7 print(data2)   #此时没有读出内容
8 f.close()

#读取前五行

1 f = open("yesterday",'r')
2 for i in range(5):
3     print(f.readline())  #循环打印,比较占内存,效率低,因为readlines是读取整个文件
4 f.close()

#不打印第10行,readlines是以列表的形式,效率很低

1 f = open("yesterday",'r')
2 for index,line in enumerate(f.readlines()):
3     if index ==9:
4         print("-----------分割线------------")
5         continue
6     else:
7         print(line.strip())   #strip函数:去除字符串左右两边(首尾)的指定字符,默认指定字符为空白字符,如空格、回车/r,换行/n,制表符/t, 换页符/f;
8 f.close()

enumerate用法请点击

#循环打印,逐行,内存中实时读取一行。效率最高

1 f = open("yesterday",'r')
2 for line in f:
3     print(line)
4 f.close()

4、count计数器

#不打印第十行,通过count计数器

1 f = open("yesterday",'r')
2 count =0
3 for line in f:
4     if count==9:
5         print("-------------分割线-----------")
6         count +=1
7         continue
8     print(line)
9     count +=1

5、tell统计字符数

1 f = open("yesterday",'r')
2 print(f.tell())    #句柄指针的位置0
3 print(f.readline())  #读一行
4 print(f.tell())     #tell是按照字符计数

6、seek光标移动

1 f = open("yesterday",'r')
2 print(f.tell())    #当前句柄指针的位置0
3 print(f.read(5))    #只读取五个字符
4 print(f.tell())     #tell是按照字符计数
5 f.seek(0)         #回到初始位置
6 print(f.tell())    #打印字符数
1 f.seek(2)
2 print(f.tell())    #把光标移回到第二个字符位置
3 print(f.seekable()) #判断是否能移动光标
4 
5 print(f.encoding)  #查看文件的字符集
6 
7 print(f.fileno()) #返回文件句柄在内存中的编号
8 print(f.readable()) #判断文件是否可读
9 print(f.writable()) #判断文件是否可写

7、flush将内存数据写到硬盘

1 print(f.flush()) #将对文件的修改,从内存写入到硬盘(默认情况是缓存满了,再写入到硬盘)

8、打印进度条效果

1 #进度条效果
2 import sys,time
3 for i in range(50):
4     sys.stdout.write("#")
5     sys.stdout.flush()
6     time.sleep(0.1)

9、truncate截断字符

截取文件中的字符串,打开文件模式一定是追加模式(a),不能是写(w)和读(r)模式

1 f = open("yesterday2",'a')
2 f.seek(5)
3 f.truncate(6) #从头开始截断6个字符,即使移动光标也没有影响
4 f.close()

10、replace文件的修改

1 #文件的修改
2 f = open("yesterday",'r')
3 f_new = open("yesterday.bak",'w')
4 for line in f:  #f文件变成了迭代器
5     if "肆意的快乐等我享受" in line:
6         line = line.replace("肆意的快乐等我享受","肆意的快乐等Alex享受")
7     f_new.write(line)
f.close()
f_new.close()

 

11、实现简单的shell sed替换功能

 1 import sys
 2 f = open("yesterday",'r')
 3 f_new = open("yesterday.bak",'w')
 4 find_str = sys.argv[1]
 5 replace_str = sys.argv[2]
 6 for line in f:  #f文件变成了迭代器
 7     if find_str in line:
 8         line = line.replace(find_str,replace_str)
 9     f_new.write(line)
10 f.close()
11 f_new.close()

12、w写模式,会将原有文件内容覆盖

1 #写模式,仅仅只能写
2 f = open("yesterday2",'w') #会将原有文件覆盖
3 f.write("我爱北京天安门,\n") #文件的写入是从第一行开始
4 f.write("天安门上太阳升")  #再次写入时,是追加在上次内容后面的
5 f.close()

13、a追加写模式,在原有内容后面追加

1 #追加写模式,仅仅只能写,不能读
2 f = open("yesterday2",'a')
3 f.write("\n我爱北京天安门.............,\n") #文件的写入是从第一行开始
4 f.write("天安门上太阳升.............")  #再次写入时,是追加在上次内容后面的
5 print(f.read())     #会报错
6 f.close()

13、r+读写模式

1 #顺序读,但是写是在文件内容最后追加
2 f = open("yesterday2",'r+')#文件句柄,读写

14、w+写读模式

1 #先进行写,将原有内容覆盖,若继续写,则进行追加
2 f = open("yesterday2",'w+') #文件句柄,写读

15、a+追加写模式

1 #追加写,还是不能读,只是不会报错
2 f = open("yesterday2",'a+') #
3 f.write("\n我爱北京天安门.............,\n") #文件的写入是从第一行开始
4 f.write("天安门上太阳升.............")  #再次写入时,是追加在上次内容后面的
5 print(f.read())     #没有显示,但不会报错
6 f.close()

16、wb以二进制编码写

1 f = open("yesterday2",'wb') #文件句柄,二进制文件
2 f.write("hello binary\n".encode()) #默认将二进制编码模式转换成utf-8
3 f.close()

17、with语句

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

1 with open("yesterday2",'r') as f:
2     for line in f:
3         print(line)

Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

1 with open("yesterday2",'r') as f1,open("yesterday.bak",'r') as f2:
2     for line in f1:
3         print(line)
4     for line in f2:
5         print(line)

格式清晰,使用 \ 换行

1 with open("yesterday2",'r') as f1,\
2         open("yesterday.bak",'r') as f2:
3     for line in f1:
4         print(line)
5     for line in f2:
6         print(line)

当with代码块执行完毕时,内部会自动关闭并释放文件资源。

 

posted @ 2017-03-19 16:13  涅槃之路  阅读(195)  评论(0编辑  收藏  举报