Python基础(三)文件基本操作

 

一、Python文件操作

 

1、对文件操作流程

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

现有文件如下: 怎么红烧白鲢

1、一条处理干净,洗干净的白鲢鱼。
2、因为大所以剁成小块。
3、准备作料,大葱切断,姜切片,酱油适量,醋可以多放点,白糖一点。盐适量。
4、锅里放油,放入3大勺白糖炒颜色,颜色发红色就可以了,中间要不停的搅动。
5、糖色红色就把鱼放进,翻炒均匀上色,然后把调好的作料倒入进去在翻炒一下。
6、糖色红色就把鱼放进,翻炒均匀上色,然后把调好的作料倒入进去在翻炒一下。
7、装入盘中就可以开吃了。

 

 1 """
 2 注意 if in the win,hello文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统
 3 默认的是gbk编码,所以直接打开会乱码,需要f=open('hello',encoding='utf8'),hello文件如果是gbk保存的,则直接打开即可。
 4 """
 5 """
 6 如果不加encoding='utf-8'
 7 默认的话是如果是win环境f = open('文件2','r') 就是 f = open('文件2','r',encoding='gbk') 
 8 # 打开一个文件,使用utf-8编码,文件是bytes类型。py编译器会为我们decode成unicode
 9 """
10 f = open('文件2','r',encoding='utf-8')
11 # data = f.read(5)   # 1、一条处   ---> 获取5个字符
12 # data = f.readline() # 1、一条处理干净,洗干净的白鲢鱼。 ---> 获取一行内容
13 # data = f.readlines()  # ['1、一条处理干净,洗干净的白鲢鱼。\n', '2、因为大所以剁成小块。\n', '3、准备作料,大葱切断,姜切片,酱油适量,醋可以多放点,白糖一点。盐适量。\n', '4、锅里放油,放入3大勺白糖炒颜色,颜色发红色就可以了,中间要不停的搅动。\n', '5、糖色红色就把鱼放进,翻炒均匀上色,然后把调好的作料倒入进去在翻炒一下。\n', '6、糖色红色就把鱼放进,翻炒均匀上色,然后把调好的作料倒入进去在翻炒一下。\n', '7、装入盘中就可以开吃了。']
14 
15 print(data)
16 f.close()

 

 

2、文件打开模式

    'r'       open for reading (default)  只读模式
    'w'       open for writing, truncating the file first   只可写
    'x'       create a new file and open it for writing
    'a'       open for writing, appending to the end of the file if it exists  追加模式
    'b'       binary mode
    't'       text mode (default)
    '+'       open a disk file for updating (reading and writing)
    'U'       universal newline mode (deprecated)

 

三种比较常用的模式介绍

1 # 如果不加encoding='utf-8' win下默认是gbk
2 with open('文件3','w',encoding='utf-8') as f:   # w模式没有文件,则新建,有文件则覆盖重新创建一个文件。只能写,不可读
3     f.write('满江红')
4 with open('文件3','a',encoding='utf-8') as f:   # a模式追加文件内容,没有文件则创建文件,有文件则在文件最后追加内容,不可读
5     f.write('\n岳飞')
6 with open('文件3','r',encoding='utf-8') as f:   # r模式只读模式,只能读,不可写
7     data = f.readlines()
8     print(data)

 

 

打印文件指定内容:

 1 # 打印文件第6行内容
 2 # 第一种方法: 不推荐
 3 with open('文件','r',encoding='utf-8') as f:
 4     number = 0
 5     for line in f.readlines():  # 这里的f.readlines() 严重不建议使用,因为会把整个文件读进内存
 6         number+=1
 7         if number == 6:
 8             print(line.strap())
 9 # 推荐使用第二种方法
10 with open('文件','r',encoding='utf-8') as f:
11     number=0
12     for line in f:   # 这是for内部将f对象做成一个迭代器,用一行去一行。
13         number+=1
14         if number == 6:
15             print(line.strap())

 

 

 1 print(f.tell())# 取出光标位置 2 f.seek(0)# 移动光标到指定的位置 3 flush():同步将数据从缓存转移到磁盘上去 

 

进度条实例:

 1 # 进度条实例
 2 import sys,time
 3 for i in range(30):
 4     sys.stdout.write('#')
 5     sys.stdout.flush()
 6     time.sleep(0.2)
 7 
 8 import sys,time
 9 for i in range(30):
10     print('=',end='',flush=True) # end=''表示不换行
11     time.sleep(0.3)
进度条

 

截断数据:

1 #truncate():截断数据(不能在r模式下)
2 # 在w模式下:先清空,再写,再截断
3 # 在a模式下:直接将指定位置后的内容截断
4 f.truncate(5)
5 f.write('hello world')
6 f.truncate(5)
7 f.close()
截断数据

 

 

# r+:光标默认在0位置,最后位置开始写
# w+:先清空,再写读
# a+:光标默认在最后位置

1 with open('文件','r+',encoding='utf-8') as f:
2     data = f.readline()  # 从起始位置开始读
3     print(data)
4     f.write('增加内容') # 从最后位置开始写

 

 

修改磁盘文件:

 1 # 终极问题 如何在磁盘修改文件
 2 # 常规思路,由于磁盘存储机制不能完成
 3 with open('文件','r+',encoding='utf-8') as f:
 4     number=0
 5     for line in f:
 6         number+=1
 7         if number==3:
 8             f.write('新增内容') # 内容会被增加到最后,所以此种方法无效,因为和r+的模式有关系
 9 
10 with open('文件','r',encoding='utf-8') as f_read,open('文件4','w',encoding='utf-8') as f_write:
11     number = 0
12     for line in f_read:
13         number+=1
14         if number == 3:
15             line = ''.join(['第三行新增内容',line])
16         f_write.write(line)
修改磁盘文件

 

 

rb模式以及seek

在py2中
 1 #昨夜寒蛩不住鸣.
 2  
 3 f = open('test','rb',) #以写读模式打开文件
 4  
 5 f.read(3)
 6  
 7 # f.seek(3)
 8 # print f.read(3) # 夜
 9  
10 # f.seek(3,1)
11 # print f.read(3) # 寒
12  
13 # f.seek(-4,2)
14 # print f.read(3) # 鸣

 在py3中

 1 # test: 
 2 昨夜寒蛩不住鸣.
 3 
 4 f = open('test','rb',) #以写读模式打开文件
 5 
 6 f.read(3)
 7 
 8 # f.seek(3)
 9 # print(f.read(3)) # b'\xe5\xa4\x9c'
10 
11 # f.seek(3,1)
12 # print(f.read(3)) # b'\xe5\xaf\x92'
13 
14 # f.seek(-4,2)
15 # print(f.read(3))   # b'\xe9\xb8\xa3'
16 
17 #总结: 在py3中,如果你想要字符数据,即用于观看的,则用r模式,这样我f.read到的数据是一个经过decode的
18 #     unicode数据; 但是如果这个数据我并不需要看,而只是用于传输,比如文件上传,那么我并不需要decode
19 #     直接传送bytes就好了,所以这个时候用rb模式.
20 
21 #     在py3中,有一条严格的线区分着bytes和unicode,比如seek的用法,在py2和py3里都是一个个字节的seek,
22 #     但在py3里你就必须声明好了f的类型是rb,不允许再模糊.
23 
24 #建议: 以后再读写文件的时候直接用rb模式,需要decode的时候仔显示地去解码.
有待考证

 

posted @ 2017-06-05 17:21  wanstack  阅读(122)  评论(0)    收藏  举报