(五)python对文件的操作
1.文件基本操作(普通读取,上下文语法)
在对文件进行读写操作时,我们会用到python的内置函数open()将文件打开进行相应操作,当我们结束对文件操作时候,需要使用close()来关闭打开的文件以释放资源,避免资源浪费
读文件
#打开文件
file=open(file,mode='r',buffering=None, encoding=None, errors=None, newline=None, closefd=True)
#读取文件,如果读不到数据,read方法返回None
file.read()
open()中各参数的含义:
file:指定打开的文件名,如果该文件不在当前工作目录下,则需要指定文件路径
mode:指定操作的模式,如下表所示:
‘r’ | 读文件(默认) |
---|---|
‘w’ | 截断写入 |
‘x’ | 重新创建一个新的文件,打开并写入 |
‘a’ | 打开文件进行写操作,追加在文件内容结尾 |
‘t’ | 文本模式(默认) |
‘+’ | 打开磁盘文件进行更新(读或写) |
‘b’ | 二进制模式 |
python中,是区分以二进制和文本模式打开文件的,mode默认的是’rt’模式,对于二进制文件的随机访问,'wb’为打开并将文件截断为0字节,'rb’为不截断的打开二进制文件
buffering:可选整数,用于设置缓冲策略。(暂时用处不大)
encoding:用于解码或编码文件的编码名称,只在文本模式下使用, 默认编码取决于平台,也可以传递 Python 支持的任何编码
errors :可选字符串,指定如何处理编码错误,在二进制模式下不使用此参数
newline:换行符控制通用换行符的工作方式(它仅适用于文本模式)。 它可以是 None、’’、’\n’、’\r’ 和 ‘\r\n’。
closefd:如果 closefd 为 False,则在文件关闭时底层文件描述符将保持打开状态。 这在给定文件名时不起作用,并且在这种情况下必须为 True。
读文本文件:
#打开文件
file=open(file='filename.txt',mode='r',encoding='utf-8')
'''如果读不到数据,read方法返回None'''
#先做一次读操作,一次读出16个字符,看是否能读到数据
data=file.read(16)
#使用循环读出所有数据
while data:
print(data,end='')
data=file.read(16)
#关闭文件,释放资源
file.close()
读二进制文件:
from io import SEEK_END,SEEK_SET
file=open(file='img.png',mode='rb')
#移动文件指针到文件末尾
file.seek(0,2) #file.seek(0,SEEK_END)
#通过tell方法查看文件指针移动的字节数,间接的到文件长度即大小
print(file.tell())
#将文件指针移动到文件最开始
file.seek(0,0) #file.seek(0,SEEK_SET)
try:
data=file.read(512) #一般写2的幂次方,512一般是系统分配磁盘空间基本单位
while data:
print(data,end='')
data=file.read()
finally:
file.close()
读官方解释器文件:
from hashlib import md5, sha256
hasher = md5() # hasher=sha256()
file = open('python-3.9.6-amd64.exe', 'rb')
try:
data = file.read(512)
while data:
# 更新MD5对象的数据
hasher.update(data)
data = file.read(512)
finally:
file.close()
# 获得十六进制形式的MD5哈希摘要
print(hasher.hexdigest())
写文本文件
#‘w'写操作会覆盖原有的内容
file=open('诗.txt',mode='w',encoding='utf-8')
try:
file.write('我想做燕子\n')
file.write('只需要简单的思想\n')
file.write('不需要复杂的语言\n')
finally:
file.close()
上下文语法:以上的读写操作中,可以看到,在完成一系列的操作之后,结尾我们都需要使用close()来关闭文件,因此,可以使用上下文语法“with as”,它能够有效管理防止编程过程中,解决对有关资源编程时忘记释放的问题
实例:文件复制/拷贝
def file_copy(source_file,target_file):
with open(source_file,'rb') as file1:
with open(target_file,'wb') as target:
data=file1.read(512)
while data:
target.write(data)
data=file1.read(512)
if __name__ == '__main__':
file_copy('source_filename.jpg','D:/Note/target_filename.jpg')
实例: 读取、操作csv(逗号分隔符文件)文件
import csv
with open('2018年北京积分落户数据2.csv',encoding='gb18030') as file: reader=csv.reader(file)
for row in reader:
print(reader.line_num) #拿行号
print(row)