python(四)文件操作

要素	
	1.文件路径
	2.编码方式
	3.操作方式:只读,只写,追加,读写,写读。。。
	mode='r' / ‘w’ / 'a'		只读/只写/追加	字符形式
				'r+' / ‘w+’ / 'a+'	读写/写读/可追加可读		字符形式
				rb' / ‘wb’ / 'ab'	只读/只写/追加	字节形式
				'r+b' / ‘w+b’ / 'a+b'	读写/写读/可追加可读	字节形式

以字符/字节形式读写文件

按字符读取 只读模式 mode=‘r’ 默认操作方式

	f = open('filedown', mode='r', encoding='utf-8')
    contents = f.read()	#一次读取所有内容
    print(type(contents))#<class 'str'>	读取的类型是字符串
    print(contents)	
    f.close()	#文件对象操作完毕后需要关闭
    #open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    #打开一个文件,并返回文件对象
    '''
	file:(当前相对路径下)文件名(文件名.后缀)或绝对路径的文件地址(例如d:\a.txt),这是必须的
			文件不存在会保报错
	mode:操作方式,默认是只读 , r ,可以不写
	encoding: 编码方式,默认utf-8
	buffering: 设置缓冲
	errors: 报错级别
	newline: 区分换行符
	closefd: 传入的file参数类型
	
	在硬盘存储的文件的编码方式与open方法的encoding编码不同时,会报错(在绝对路径下回出现的问题)
	在相对路径下,文件编码有编辑器统一,encoding='utf-8'或encoding='ansi'都能读取同一个文件
	
	
	'''

按字节读取 mode=‘rb’ :文件的操作方式默认为r,只读,对于纯文本类型的文件,这种方式是可以的
但是对于图片等非文字,这种方式不适用
对于只读的升级版,rb,以二进制的形式打开一个文件用于只读

	f = open('filedown', mode='rb')	
    contents = f.read()
    print(type(contents))#<class 'bytes'>	读取的类型是字节
    print(contents)
    f.close()
    '''
    rb模式下,不接受encoding参数等部分参数
    读取的文件都是bytes类型数据
    b'\xe5\x88\x98\xe4\xb8\x80'
    适合文件的上传,下载,传输

	'''

按字符写入 只写模式 mode=‘w’

	#只写
    f = open('files', mode='w',encoding = 'utf-8')
    leng = f.write('''hello 
    world
    ''')#返回写入数据的字符个数,可以不接收
    print(leng)
    f.close()
    #找到files文件,没有这个文件就创建这个文件,编辑工具可能无法显示创建的这个文件
    #可以切换视图类型或去本地实际的储存路径下查看
    #如果当前文件已有内容,清空文件内容再写入(这个方法能清空文件所有内容)

按字节写入,mode=‘wb’,适合上传,下载,数据传输

	f = open('files', mode='wb')#以bytes类型写入文件
    f.write('hellworld'.encode('utf-8'))
    f.close()
   '''mode='wb'需要的是bytes类型
	'hellworld'.encode('utf-8') 传入的是str类型数据需要转为bytes类型
	str——>bytes : str.encode('utf-8')
	bytes ——> str: bytes.decode('utf-8')
	以这种方式写入一样会清空文件内容再写入
	'''

按字符追加 追加模式 mode = ’ a ’

#追加
    f = open('files',mode='a',encoding='utf-8')
    f.write('三思而行')
    f.close()
    '''
		在文本末尾追加
	'''

按字节追加 mode = ’ ab ’

#以bytes类型追加
    f = open('files',mode='ab')
    f.write('三思而行'.encode('utf-8'))
    f.close()

按字符读写 读写模式 mode = ’ r+ ’ (常用)

	#读写r+
    f = open('files',mode='r+',encoding='utf-8')
    print(f.read())
    f.write('sadhjhf')
    print(f.read())
    f.close()
    '''
	先进行读,再进行写,后续写入的内容无法读取
	因为当前文件原有的内容读取后,文件光标停在文件内容的末尾,所以写入的内容在光标处写入
	即在文件末尾添加新写入的内容,不会清空原内容,光标停在新写入内容的末尾
	再次读取时,光标向下读取,此时光标在文件末尾没有内容可以读取,所以没有内容

	如果先写后读,此时光标在文件首位,写入的字符会自动覆盖原先的内容,所以先读取将光标移至内容末尾在新写入传入的内容
	'''

按字节读写模式 mode = ’ r+ b’

#读写r+b
    f = open('files',mode='r+b')
    f.read()
    f.write('时间及时真理'.encode('utf-8'))
    f.close()

按字符写读 写读模式 mode = ‘w+’

#写读 w+
    f = open('files',mode='w+',encoding='utf-8')
    f.write('wanwuguiyi ')
    print(f.read())#无输出
    f.close()
    '''
	先清空文件内容再写入
	此时光标在文件末尾,所以read()读取的内容为空
	调整文件光标的位置 来获取输出
	f.seek(0)将光标调至文件首位
	print(f.read())
	f.close()
	'''

按字符写入 可追加可读 mode = ‘a+’

	f = open('files',mode='a+',encoding='utf-8')
    f.write('挖掘和客户机 ')
    f.seek(0)
    print(f.read())
    f.close()

读取未知编码文件

'''
https://pypi.org/project/chardet/ 下载chardet模块chardet-3.0.4.tar.gz
解压文件夹chardet-3.0.4中有一个chardet文件夹
复制粘贴至Python\Python37\Lib\site-packages下即可引用
chardet模块 识别数据的编码方式
'''
import chardet
#name = '小猫'.encode()	#将字符编译为字节
#print(chardet.detect(name))	#需要一个字节参数,判断字节数据的编码
#{'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}
#返回一个字典数据,判断编码为utf-8,几率大致是0.7525


#读取未知编码文件
with open(r'test.txt','rb') as f:#以字节形式读取文件
    date = f.read()
    ret= chardet.detect(date)#读取文件编码
    print(ret)
    date = date.decode(ret['encoding'])#将字节以文件编码格式解码为字符串
    print(date)

字符串与字节类型在内存占用的大小

import sys
st = '你好'
print(type(st))#<class 'str'>
print(sys.getsizeof(st))#78

s = bytes(st,encoding='utf-8')
print(type(s))#<class 'bytes'>
print(sys.getsizeof(s))#39

文件操作相关方法


    f = open('files')
    if f.readable():#判断文件时可读 True/False
        for ret in f:	
            print(ret,end=' ')	#读取文本中所有数据,一行一行输出
       #ret = f.readline()	读取文本中一行数据,一次一行
       #re = f.readlines()#读取文本所有数据,每一行作为一个列表元素,元素末尾会有\n
      	#f.seek(0)#设置文件光标位置
        #f.tell()#获取文件当前光标位置,返回int值,可用于断点续传
        #f.seek(f.tell())
        #f.truncate(n) 截取文件中当前节点后n个字符,会清空文件内容再写入n个字符
    f.close()
'''取出元素末尾\n
re = f.readlines()#读取文本所有数据,每一行作为一个列表元素
        li = []
        for i in re :
            s = i.split('\n')[0]
            li.append(s)
        print(li)
'''

文件操作总结:

视频,图片等文件用bytes类型 读写 rb 按字节读
read() ,readlines()一次性读取所有内容
readline()一行一行读,缺点是不确定光标位置
读文件最好是使用for循环

操作文件的其它形式

 with open('files') as f,open('down') as d:
        pass 
 '''
1.这种方法可以打开多个文件
2.可以给文件对象起别名
3.不用写f.close(),自动关闭


'''

str类型数据一般是unicode编码,不便传输,所以需要转为bytes类型
str与bytes用法一致,仅在于编码不同
bytes更利于传输

文件修改的修改流程:

		1.读取文件内容
		2.修改文件内容
		3.创建新文件
		4.存储新内容
		5.获取旧文件名
		6.删除旧文件
		7.重命名新文件
发布了16 篇原创文章 · 获赞 0 · 访问量 79

猜你喜欢

转载自blog.csdn.net/qq_31241107/article/details/103403150