1.文本形式:
根据文件中的组织形式可以划分为:
1.1 文本文件(文本文件存储常规字符串,有若干文本行组成,通常每行使用'n'结尾。字符串指的是记事本或其他文本编辑器能够正常显示、编辑并且能够被人类直接阅读和理解的字符串)
1.2 二进制文件(把对象内容以字节串(bytes)进行存储 ,无法用记事本或其他普通文件编辑器直接进行编辑,通常也无法被人类直接阅读和理解, 需要使用专门的软件进行解码后读取,显示,修改和执行)
2.文件操作格式:
2.1 文件对象名=open(文件名,[,打开方式[,缓冲区]])
2.2 文件名:需要进行操作的文件,需要相对路径,可以使用原始字符串
2.3 打开方式:有只读(r),只写(w),有追加(a),有二进制模式(b),有读写( ),其中二进制模式和读写可以与其他模式组合使用
2.4 文件对象属性:closed(判断文件是否关闭,没有关闭就关闭文件,关闭就返回True),mode(返回文件打开模式),name(返回打开文件名) #缓冲区:指定了读写文件的缓存模式,0(表示不缓存),1(表示缓存),n(n>1,表示缓存区的大小),默认值(默认值为缓存模式)
3.文件对象常用方法:
代码语言:javascript复制flush() 把缓冲区内容写入文件,但不关闭文件
close() 把缓冲区内容写进文件,并关闭文件,释放文件对象
read([size]) 从文件中读取size个字符的内容作为结果返回,如果省略size则表示一次性读取所有内容
readline() 读取文本一行内的内容
readlines() 读取文本行内容,并将每一行存进一个列表中,返回该列表
seek(offset[,wehence]) 把文件指针移动到新的位置,offset表示相对于whence的位置,whence可以为0(表示从文件开头开始计算),1(表示从当前位置开始计算),2(表示从文件末开始计算)
tell() 返回文件指针当前的位置
truncate([size]) 删除从当前指针位置到文件末尾的内容,如果指定了size的值,则只保留前size个字节,其余1的删除
writes(s) 把字符串内容s写进文件
writelines(s) 把字符串列表写入文本文件,不添加换行符
4.案例使用
4.1 以追加方式打开文件并写入"Hello, my open file! "
代码语言:javascript复制#方法一,需要显示调用close()
fp1=open('1.txt','a ')
s='Open File first way!' 'n'
fp1.write(s)
fp1.close()
#方法二,使用with关键字,会自动管理资源
s='Open file second way!' 'n'
with open('1.txt','a ') as f:
f.write(s)
查看文本内容
代码语言:javascript复制#rean()/readline()/readlines()
fp=open('1.txt','r ')
print('读取所有内容:',fp.read(),end='n')
print('查看当前文件指针:',fp.tell(),end='n')
print('设置文件指针:',fp.seek(0),end='n')
print('读取第一个字符内容:',fp.read(1),end='n')
print('读取第一行内容:',fp.readline(),end='n')
print('读取所有行内容,以列表形式存储:',fp.readlines(),end='n')
fp.close()
4.2 读取文本所有整数,并将其升序排序
代码语言:javascript复制import re
def order(filename):
with open(filename,'r ') as fp2:
s=fp2.read()
#print(s)
list=re.split(r's ',s)
for i in range(len(list)):
list[i]=int(list[i])
list.sort()
#print(list)
#print(list)
#print(list,end='n')
order('2.txt')
4.3 打开一个文件,在其尾部每一行加上一个其行数,使用列表推导公式
代码语言:javascript复制def add(filename):
with open(filename,'r ') as fp3:
s1=fp3.readlines()
#for i in range(len(s)):
# s[i] ='n'
s1=[s.rstrip() ' '*(100-len(s)) '#' str(index) 'n' for index,s in enumerate(s1)]
with open('4.txt','a ') as fp4:
fp4.writelines(s1)
#for i in range(len(s)):
# fp4.write(s[i])
add('3.txt')
5.二进制文件的操作
1)二进制文件操作,只有正确理解了二进制文件的序列化和结构化话规则,才能正确理解其中内容并设计正确的反序列化规则,常用的二进制文件序列化模块有struct、pickle、json、marshal、shelve.
2)案例使用
①pickle模块 写入信息到文件
代码语言:javascript复制import pickle
fp5=open('1.dat','wb')
n=1
i=100
c=1.9
s='中国'
lis=[[1,2,3],[2,3,4],[4,5,6]]
dic={'1':'1','2':'2','3':'3'}
tup=(1,2,3,4)
coll={1,2,3,4}
try:
pickle.dump(n,fp5)
pickle.dump(i,fp5)
pickle.dump(c,fp5)
pickle.dump(dic,fp5)
pickle.dump(lis,fp5)
pickle.dump(tup,fp5)
pickle.dump(coll,fp5)
pickle.dump(s,fp5)
except:
print('output error!')
finally:
fp5.close()
从文件中读取信息
代码语言:javascript复制fp6=open('1.dat','rb')
n=pickle.load(fp6)
i=0
while i<n:
print(pickle.load(fp6),end='n')
i =1
fp6.close()
②stuct模块 写入到文件
代码语言:javascript复制import struct
sn=struct.pack('if?',n,i,c)
fp7=open('2.dat','wb')
fp7.write(sn)
fp7.write(s.encode())
fp7.close()
读取操作
代码语言:javascript复制fp8=open('2.dat','rb')
sn=fp8.read(9)
tu=struct.unpack('if?',sn)
print(tu)
n,x,b=tu
print('n=',n,'x=',x,'b=',b,end='n')
s=fp8.read(9)
s=s.decode()
print('s=',s,end='n')
6.学习笔记:
1.文件类型:文本文件(可以被人类直接解读);二进制文件(需要借助特殊工具才能完成解读);
2.文件打开常见操作有以读的方式(r),以写的方式(w),以二进制模式(b),以追加模式(a),以读写模式( )
3.文件对象常用方法:
代码语言:javascript复制#flush() 把缓冲区内容写入文件,但不关闭文件
#close() 把缓冲区内容写进文件,并关闭文件,释放文件对象
#read([size]) 从文件中读取size个字符的内容作为结果返回,如果省略size则表示一次性读取所有内容
#readline() 读取文本一行内的内容
#readlines() 读取文本行内容,并将每一行存进一个列表中,返回该列表
#seek(offset[,wehence]) 把文件指针移动到新的位置,offset表示相对于whence的位置
# ,whence可以为0(表示从文件开头开始计算),1(表示从当前位置开始计算),2(表示从文件末开始计算)
#tell() 返回文件指针当前的位置
#truncate([size]) 删除从当前指针位置到文件末尾的内容,如果指定了size的值,则只保留前size个字节,其余1的删除
#writes(s) 把字符串内容s写进文件
#writelines(s) 把字符串列表写入文本文件,不添加换行符
4.二进制文件的操作需要引用其他模块,常见的有struct、pickle、json、marshal、shelve.
5.在打开文件时,如果没有找到指定文件,会自动创建一个文件。