一.python文件操作的步骤

1.先open打开一个文件

f = open("文件路径",“文件访问模式”)

2.对文件的操作

3.close关闭打开的文件

f.close()

也可以使用一行命令打开文件,不用close()关闭:with open("文件路径",“文件访问模式”) as f:

二.文件的访问模式

访问模式说明

r(read)

只读模式,不能写(文件必须存在,不存在会报错)

w(write)

只写模式,不能读(文件存在则会被覆盖内容(要千万注意),文件不存在则创建)

a(append)

追加模式,不能读

r+

读写模式

w+

写读模式

a+

追加读模式

rb

二进制读模式

wb

二进制写模式

ab

二进制追加模式

rb+

二进制读写模式

wb+

二进制写读模式

ab+

二进制追加读模式

三.只读模式r

只读模式读取数据

f = open('/tmp/1.txt", encoding="utf-8") # 默认就是只读模式

#如果不同平台,可能会字符集编码不一致,不一致的需要指定;一致的不用指定。

data1=f.read()

data2= f.read() #读第二遍

f.close()print(data1)print("="*50)print(data2) #发现读第二遍没有结果;类似从上往下读了一遍,第二次读从最后开始了,所以就没结果了

tell()与seek()的使用

tell()  获取当前的读取数据的位置(可以理解为一个读光标当前的位置)

seek(n)  从第n个字符开始读取(将读光标移动到第n个字符)

f = open("/tmp/1.txt", "r")print(f.tell()) #结果为0 (告诉你光标在哪,刚打开文件,光标在0位置)

f.seek(5) #移你的光标到整个文件的第6个字符那(因为0为第一个)

print(f.tell()) #结果为5

f.seek(2) #移你的光标到整个文件的第3个字符那,从0开始算,而不是从上面的位置开始算

print(f.tell()) #结果为2

f.close()

f = open("/tmp/1.txt", mode="r")

data1= f.read() #读了第一次后,光标在最后的位置

f.seek(0) #通过seek(0)将光标又重置回开始的位置

data2 = f.read() #再次读的话,就可以又重头读一遍了,data2变量的内容与data1的内容就一致了

f.close()print(data1)print("="*20)print(data2)

read(),readline()和readlins()三种读数据的方法

f = open("/tmp/1.txt", "r")

f.seek(5) #光标移到第6个字符那里

data1 = f.read() #read是读整个文件在光标后面的所有字符(包括光标所在的那个字符),读完后,会把光标移到你读完的位置

f.seek(5) #光标重置到第6个字符那里

data2 = f.readline() #readline是读光标所在这一行的在光标后面的所有字符(包括光标所在的那个字符),读完后,会把光标移到你读完的位置

f.seek(5) #光标重置到第6个字符那里

data3 = f.readlines() #readlines和read类似,但把读的字符按行来区分做成了列表

f.close()print(data1)print("="*30)print(data2)print("="*30)print(data3)

循环读取文件

f = open("/tmp/1.txt", "r")#循环方法一:

for index, line inenumerate(f.readlines()):print(index, line.strip()) #需要strip处理,否则会有换行

#循环方法二:这样效率较高,相当于是一行一行的读,而不是一次性全读(如果文件很大,那么一次性全读会速度很慢)

for index, line inenumerate(f):print(index, line.strip())

f.close()

四.只写模式w

只读模式下,只能向文件写内容,不能读取

如果文件不存在,会自动创建

如果文件已存在,则会先清空文件,再向文件写入数据

f = open("/tmp/2.txt", 'w') #文件不存在,会帮你创建(类似shell里的 > 符号)

#data = f.read() # 只写模式,读会报错

f.write("hello\n") #不加\n,默认不换行写

f.write("world\n")

f.truncate()#截断,括号里没有数字,那么就是不删除

f.truncate(3) #截断,数字为3,就是保留前3个字节

f.truncate(0) #截断,数字为0,就是全删除

f.close()

将九九乘法表写入文件

f = open("/tmp/3.txt", "w")for i in range(1, 10):for j in range(1, i+1):

f.write("{}*{}={}".format(i, j, i*j))

f.write("\n")

f.close()

五.追加模式a

追加模式下,文件不存在会自动创建,文件存在则会在文件末尾追加数据,不会覆盖原有数据

f = open("/tmp/2.txt", 'a') #类似shell里的>>符

f.write("hello\n")

f.write("world\n")

f.truncate(0)#追加模式也可以使用truncate截取前面的数据

f.close()

六.list,tuple,dict.set的文件操作

对于list,tuple,dict,set的数据需要使用二进制的方式读写,否则写入或读出的数据可能会乱码

import pickle #数据持久性模块

#列表可以换成元组,字典,集合等数据类型,效果相同

list1 = [1, 2, 3, 4, "xianqian"]

f= open("3.txt", mode="wb")#write的参数为str类型,不能直接写list,tuple,dict,set等数据类型,需要导入模块pickle,使用二进制模式wb写入,

pickle.dump(list1, f) #将list1元素写入文件描述符f

f.close()

f1= open("3.txt", mode="rb")

data= pickle.load(f1) #将f1中的数据读出来

print(data)

f.close()

七.编码与解码

编码时使用什么字符集,解码时要用相同的字符集解码

#要注意文件本身自带的编解码和写入读出的手动编解码是两回事

with open("1.txt",mode="wb") as f1:

str1= "xianqian嘿嘿"f1.write(str1.encode("utf-8"))

with open("1.txt", mode="rb") as f2:

data=f2.read()#data = f2.read().decode("utf-8")

print(data)

八.扩展了解r+模式

#r+ mode

f= open("httpd.conf", mode="r+")## f.read()#f.readline()#f.seek(f.tell())## f.seek(f.tell())#f.write("hello world\n")

for i in range(41):

f.readline()

f.seek(f.tell())

f.write("Listen 8080\n")

f.close()#r+模式下,如果直接写,会从0位置处开始写,并且覆盖原位置的字符,写多少字符就覆盖多少字符,如果写入换行符,会覆盖原有的两个字符

#r+模式下,使用了read()或readline()或readlines()后再写字符,会在文件最后写入,readline()读取后,会换行写;#read()或readlines()读取后会在同一行写