Python程序设计之文件(上)

参与拿奖:本文已参与「新人创作礼」活动,一起开启掘金创作之路
复制代码
1.文本形式:

根据文件中的组织形式可以划分为: ①文本文件(文本文件存储常规字符串,有若干文本行组成,通常每行使用'\n'结尾。字符串指的是记事本或其他文本编辑器能够正常显示、编辑并且能够被人类直接阅读和理解的字符串) ②二进制文件(把对象内容以字节串(bytes)进行存储 ,无法用记事本或其他普通文件编辑器直接进行编辑,通常也无法被人类直接阅读和理解, 需要使用专门的软件进行解码后读取,显示,修改和执行)

2.文件操作格式:

①文件对象名=open(文件名,[,打开方式[,缓冲区]]) ②文件名:需要进行操作的文件,需要相对路径,可以使用原始字符串 ③打开方式:有只读(r),只写(w),有追加(a),有二进制模式(b),有读写(+),其中二进制模式和读写可以与其他模式组合使用 ④文件对象属性:closed(判断文件是否关闭,没有关闭就关闭文件,关闭就返回True),mode(返回文件打开模式),name(返回打开文件名) #缓冲区:指定了读写文件的缓存模式,0(表示不缓存),1(表示缓存),n(n>1,表示缓存区的大小),默认值(默认值为缓存模式)

3.文件对象常用方法:

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.案例使用

①以追加方式打开文件并写入"Hello, my open file! "

#方法一,需要显示调用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)
复制代码

查看文本内容

#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()
复制代码

②案例2读取文本所有整数,并将其升序排序

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')
复制代码

③案例3打开一个文件,在其尾部每一行加上一个其行数,使用列表推导公式

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模块 写入信息到文件

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()
复制代码

从文件中读取信息

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模块 写入到文件

import struct
sn=struct.pack('if?',n,i,c)
fp7=open('2.dat','wb')
fp7.write(sn)
fp7.write(s.encode())
fp7.close()
复制代码

读取操作

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')
复制代码
学习笔记:

1.文件类型:文本文件(可以被人类直接解读);二进制文件(需要借助特殊工具才能完成解读);

2.文件打开常见操作有以读的方式(r),以写的方式(w),以二进制模式(b),以追加模式(a),以读写模式(+)

3.文件对象常用方法:

#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.在打开文件时,如果没有找到指定文件,会自动创建一个文件。

猜你喜欢

转载自juejin.im/post/7079586163832389645