python文件操作

一、文件操作方法

  • open()方法 : open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • encoding:表示编码方式,None表示默认的编码方式, 一般使用utf8.
  • buffering:是指缓冲大小,-1表示默认大小4096,0表示关闭缓冲区, encoding表示编码方式,None表示默认的编码方式;
  • errors:表示编码错误被捕获,如果是errors=ignore,那么出现编码错误将会被忽略;
  • newline:表示文件换行的意思;
  • closefd:表示是否关闭文件时同时关闭文件描述符
  • mode模式参数常用值
  • 'r':只读;
  • 'w':只写,从开头开始写,所以会覆盖文件的内容;
  • 'a':追加,不会覆盖文件内容;
  • 'x':只写,如果文件不存在则创建文件,以只写方式打开文件,保护写;
  • 'b':二进制;
  • 't':文本,是默认的模式,可以不写,一般都是以文本模式打开文件;
  • '+':读写;
  • 'r+':给只读赋予写的能力;
  • 'w+':给只写赋予只读的能力,因为是以只写的形式打开文件,会清空文件内容,所以不能读取到内容,只是有了读的功能;
#读取一个文件:f=open('磁盘名:\\文件名',mode='r',encoding='utf-8') #默认打开模式就为r
读取文件会用到read()函数,用于从文件中读取指定的字符数,如果未给定或为负值则表示读取所有字符;
如果文件非常大,尤其是大于内存时,无法使用read()方法

f=open('D:\Python_html\PythonProject\1text1',mode='r',encoding='utf-8')
data=f.read()
#f.write('abc')只读方式打开不能写入,否则会报错
print(data)#输出的就是文件里面之前写入的内容
f.close()#关闭文件

#上面'D:\Python_html\PythonProject\1text1'是一个绝对路径,如果要执行的.py文件和要读取的文件在同一目录下,且同级,可以采用相对路径来读取文件,此时只需输入它的文件名即可
f1=open('1text1',mode='r',encoding='utf-8')
data=f1.read()
print(data)
f1.close()
  • 文件写入
w为只写模式
f=open('text1',mode='w',encoding='utf-8')
ret=f.write('abc')
#f.read(),文件只写,读取会报错
f.close()
print(ret)#返回写入字符串的长度3
#用'w'方式写入‘abc’,原文件里面的数据会被覆盖,此时文件里只有刚刚写入的‘abc’

x是只写,文件不存在,创建文件,文件存在会报错,以只写方式打开
#'x'模式下,会新建一个text2文件,再写入'efg'
f=open('text2',mode='x',encoding='utf-8')#'text2'文件未创建
f.write('efg')
f.close
  • 文件追加
如果有原文件,源文件里面的内容不会被覆盖,在源文件的后面继续追加数据,
f=open('text1',mode='a',encoding+'utf-8')
f.write('efg')
f.close()

如果文件不存在,会创建一个,在写入数据
f=open('text3',mode='a',encoding='utf-8')
f.write('efg')
f.close()
  • r+:读写
r+模式下,写入的内容会追加到原数据的尾部,不会覆盖原来的数据
f=open('text1',mode='r+',encoding='utf-8')
ret=f.read()
print(ret)#输出原文件里面的数据
f.write('python文件读写')
ret2=f.read()#无法读取到,因此下面不会输出ret2的结果
print(ret2)#没有输出
f.close()
  • w+:写读
w+:该模式下,将原文件中的数据清空,第一次读取为空,写入数据后,再读取,由于光标在结尾,读取为空
f=open('text1',mode='w+',encoding='utf-8')
ret=f.read()
print(ret)#读取为空
f.write('12345')
ret2=f.read()
print(ret2)#读取为空
f.close()
  • a+:写读
该模式下,若文件不存在,则会创建该文件
f=open('text',mode='a+',encoding='utf-8')
ret=f.read()
print(ret)#读取为空
f.write('追加的数据')
ret1=f.read()
print(ret1)#读取为空
f.close
  • 设置光标:seek()
f=open('text',mode='w+',encoding='utf-8')
f.write('天天向上')
f.seek(0)#把光标设置在开始的位置
ret=f.read()
print(ret)#天天向上
#之前未读取出来是因为,光标在末尾,所以读取为空
f.close()
  • 读取非文本文件
对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)

以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码,该方式打开,r、w、a等用法一样,只不过操作的对象是字节类型的数据
rb只读模式:
f=open('007.jpg',mode='rb')
ret=f.read()
print(ret)#输出的是该图片的字节编码
f.close()

除rb只读模式,还有wb只写模式,ab追加模式,w+b写读,a+b写读等,用法和w,a等一样,open()时不要指定编码

encode()和decode()方法
f=open('text',mode='w+b')
f.write('abce解码'.encode('utf-8'))
f.seek(0)
ret=f.read()
print(ret)#b'abce\xe8\xa7\xa3\xe7\xa0\x81'
print(ret.decode('utf-8'))#abce解码
f.close()
  • tell()方法:是读取光标的位置
f=open('text',mode='a+',encoding='utf-8')
ret=f.read()
print(ret)#读取为空
print(f.tell())#25
f.write('追加的数据')
f.seek(0)
print(f.tell())#0
print(ret1)#abce解码追加的数据追加的数据
f.close
  • truncate 指定个数 把文件中的内容按照截取的个数 剩余的内容删除
truncate()方法:是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了
#原先text文件中写入'abcdef'
f=open('text',mode='a+',encoding='utf-8')
f.truncate(4)#截取原文件中的前四个
f.seek(0)
print(f.read())#abcd
f.write('追加的数据')
f.seek(0)
print(f.read())#abc追加的数据
f.truncate(3)#从修改后的文件中截取前三个
f.seek(0)
print(f.read())#abc
f.close()
  • with关键字:可以避免打开文件后忘记关闭,造成内存过满
使用规则:with open('文件路径',mode='',encoding='')as 变量名:
with open('text',mode='a+',encoding='utf-8')as f1:
    f.write('abce')
    f.read()
    
    
text8文件中内容
第一行123
第二行456
第三行789
第四行101

readline()方法:仅读取一行
with open('text8',encoding='utf-8',mode='r+')as f2:
    line=f.readline()# 每次读取一行内容
    for i in line:
        print(line.strip('\n'))#输出的即为text8中一样格式的内容
        line=f.readline()

with open('text8',encoding='utf-8',mode='r+')as f:
    line=f.readline()
    while line:
        print(line.strip())
        line=f.readline()

readlines() 方法 
with open('text8',encoding='utf-8',mode='r+')as f2:
    line=f2.readlines()
    print(line)#['第一行123\n', '第二行456\n', '第三行789\n', '第四行101']
    for i in line:
        print(i.strip())
#输出:
第一行123
第二行456
第三行789
第四行101