python中的文件操作

一.初识文件操作

  使用open(函数)来打开一个文件,获取到文件句柄(文件的标识,每个文件都有自己独一无二的句柄)

open(文件名(或路径),mode='打开方式',encoding='字符集(如gbk)')

打开文件的方式:r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b.

  读取完文件句柄一定要关闭 f.close()

二.只读(r,rb)

1.

 1 f=open('国家队',mode='r',encoding='utf-8')
 2 s=f.read()
 3 print(s)
 4 f.close()
 5 # 张继科景甜
 6 # 贾乃亮
 7 # 马龙
 8 # 郭晶晶
 9 # 田亮
10 # 叶一茜
11 # 倪妮

这里的encoding表示编码集,对大部分的人而言更多的是utf-8,与encode无关.

 打开方式是rb的时候,后面不能写encoding=''.

1 f=open('e:/153.jpg',mode='rb')
2 s=f.read()
3 print(s)
4 f.close()
5 # b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x01,\x01,\x00\x00\xff\xe1\x00\xd4Exif\x00\x00MM\

 rb读取的是非文本文件,是无法显示出来的,显示出来的是bytes类型.

 2.绝对路径和相对路径

  绝对路径:从磁盘根目录开始一直到文件名.

  相对路径:如果在同一个文件夹中,相对路径就是这个文件名.如果在上一层文件夹,要用../

  推荐使用相对路径.因为如果把程序拷贝给别人使用,绝对路径会有很多麻烦

 3.读取文件的方法

  3.1 read()是将文件中的内容全部读取出来,但是在实际操作中,尽量不要用,因为如果文件过大,容易导致内存崩溃.

  read(n)是读取n个字符,如果是rb模式,读取出来的是n个字节.如果再次读取,会从当前位置读,而不是从头读.

 1 f=open('e:/153.jpg',mode='rb')
 2 s=f.read(1)
 3 print(s)   #b'\xff'
 4 a=f.read(1) #b'\xd8'
 5 print(a)
 6 f.close()
 7 
 8 
 9 f=open('国家队',mode='r',encoding='utf-8')
10 s=f.read(1)
11 print(s)   #
12 a=f.read(1)
13 print(a)    #
14 f.close()

   3.2 readline() 一次读取一行的数据.\n也会读出来,如果想去掉用strip()方法,同时readline()自带一个\n.

1 f=open('../day07/国家队',mode='r',encoding='utf-8')
2 content=f.readline().strip()
3 content1=f.readline().strip()
4 content2=f.readline().strip()
5 content3=f.readline().strip()
6 print(content)
7 print(content1)
8 print(content2)
9 print(content3)

张继科景甜
贾乃亮
马龙
郭晶晶

   3.3 leadlines() 每一行作为一个字符串元素放到列表中,会将所有的内容读取出来,所以也容易出现内存奔溃的问题.

1 f=open('../day07/国家队',mode='r',encoding='utf-8')
2 lis=f.readlines()
3 print(lis)   #['张继科景甜\n', '贾乃亮\n', '马龙\n', '郭晶晶\n', '田亮\n', '叶一茜\n', '倪妮']

  3.4 循环读取.每次读取一行内容

 

1 f=open('../day07/国家队',mode='r',encoding='utf-8')
2 for line in f:
3     print(line.strip())

 

三.只写(w.wb)

写入的时候,如果没有该文件,则会创建文件:

如果这个文件存在,则将原文件中的内容删除,在写入新内容(多次使用f.write()只有第一次将原文件中的内容全部删除)

 

1 f=open('动画片.txt',mode='w',encoding='utf-8')
2 f.write('金毛狮王')
3 f.write('大耳朵图图')
4 f.write('小耳朵我')    #金毛狮王大耳朵图图小耳朵我
5 f.flush()
6 f.close()

 

wb的模式下,写文件时,必须将字符串转换成utf-8的byte()数据.

 

1 f=open('动画片.txt',mode='wb')
2 f.write('他大舅'.encode('utf-8'))
3 f.flush()
4 f.close()

 

四.追加(a,ab)

写入的内容会追加到文件的结尾

 

1 f=open('动画片.txt',mode='a')
2 f.write('qwert')     #qwertqwert
3 f.flush()
4 f.close()

 

五.r+(读写)

对于读写模式,必须是先读,然后再进行写入.否则会将开头的内容覆盖掉.,这里的write是追加,不会删除原文件.

 

1 f=open('动画片.txt',mode='r+',encoding='utf-8')
2 a=f.read()
3 print(a)    #qwertqwertqwertyuiqwertyui是的法规
4 b=f.write('qwertyui是的法规')    #这里的write是在原文件后追加,不是删除后再添加
5 f.flush()
6 f.close()

 

六.w+(写读)

现将所有的内容清空,然后写入,最后读取,但读取的内容是空的.

1 f=open('动画片.txt',mode='w+',encoding='utf-8')
2 f.write('haha')    #haha
3 content=f.read()    #
4 print(content)
5 f.flush()
6 f.close()

七.a+写读(追加写读)

 

1 f=open('动画片.txt',mode='a+',encoding='utf-8')
2 f.write('刘的爱')    #qwertykl刘的爱
3 content=f.read()      #
4 print(content)
5 f.flush()
6 f.close()

 

八.其他操作方法

1. seek(n) 将光标移动到n位置,这里n的单位是byte,如果使用的是utf-8的中文,要是三的倍数.

  移动到开头:seek(0)

  移动到结尾:seek(0,2)

  seek中的第二个参数代表从哪个位置进行移动,0表示开头,1表示当前位置,2表示结尾.第一个参数代表偏移量.

2. tell() 可以帮助我们获取当前光标的位置(单位是byte)

3. f.truncate() 删除光标后面的所有内容

★在r+模式下,光标不管用,如果读取了内容,不管光标是多少.再写入和操作的时候都是在结尾进行的

九.文件的修改

  创建一个文件的副本,在副本中修改信息,修改完成后,将新文件的名字改成老文件的名字.

 

1 import os    #引入os模块
2 with open('彩票.txt',mode='r',encoding='utf-8') as f1,open('彩票_new.txt',mode='w',encoding='utf-8') as f2:    #另一种打开方式
3     content=f1.read()
4     new_content=content.replace('疾病','健康')
5     f2.write(new_content)
6 os.remove('彩票.txt')   #删除'彩票.txt'
7 os.rename('彩票_new.txt','彩票.txt')   #重命名

以上 一次将所有的内容都读取了,内存容易奔溃,解决此问题的方案是可以一行一行的读取和操作:

1 import os
2 with open('彩票.txt',mode='r',encoding='utf-8') as f1,open('彩票_new.txt',mode='w',encoding='utf-8') as f2:
3     for line in f1:
4         new_line=line.replace('疾病','健康')
5         f2.write(new_line)
6 os.remove('彩票.txt')
7 os.rename('彩票_new.txt','彩票.txt')
posted @ 2018-08-06 15:50  ★行者尚★  阅读(411)  评论(0编辑  收藏  举报