Python基础—文件的读写操作
一、文件的操作
1.文件初识
文件的概念
- 数据的抽象和集合
- 存储在存储器上的数据序列
- 一种数据存储形式
- 形态:二进制和文本文件
文本文件和二进制文件
- 文本文件:由单一特定的编码组成的文件,如utf-8,存储着的长字符串
- 二进制文件:直接有比特0和1组成,没有同意的字符编码;一般存在二进制0和1的组织结构,即文件格式;如png,avi
2.文件的操作
操作流程
1.给定文件路径打开,产生一个数据流(文件句柄)。
2.对数据流(文件句柄)进行相应的操作。
3.关闭数据路(文件句柄)
# 1. 打开文件,得到文件句柄并赋值给一个变量 f = open('D:\PyCharmProject\python全栈S20\day007\\file_read.txt', 'r', encoding='utf-8') # 2. 通过句柄对文件进行操作 print(f.read()) # 3. 关闭文件 f.close()
# 第二种打开反方式 with open # with open(filename, mode, encoding) as f: # f.read() # 注意缩进 # 打开多个文件 with open(filename1, mode, encoding) as f1,\ open(filename2, mode, encoding) as f2: with open('a.txt','rt',encoding='utf-8') as f: f.read() # 缺点:当在打开文件中继续操作文件时,可能由于执行语句没有执行关闭文件,下面继续调用会出现报错(IOError)
打开文件的坑:
1.路径问题
1.'\'与不同的字母或数字会有特殊的含义,导致系统读取路径时当成别的含义
2.解决方法:路径前面加一个r,使字符串变为原始字符串,或者在有歧义的'\'前面加一个'\'进行转义。
2.编码问题:UnicodeDecodeError
编码要与文件存储时的编码模式保持一样
文件的打开方式:
文件的读操作
''' 文件的写: 写入方法: w:创建写模式:文件名不存在,则创建写;存在则清空内容在写入 wb:以二进制的方式创建写入 w+:写读模式,可写可读 f = open(filename, mode, encoding) ''' # w:创建写模式,文件名不存在,则创建写;存在则清空内容在写入 f = open('file_write.txt', 'w', encoding='utf8') f.write('i am handsome!\n') f.write('i am handsome!\n') f.write('i am handsome!\n') f.write('i am handsome!\n') f.close() ''' 非字符内容的读取和复制 ''' # 以二进制方式读入非字符内容 f1 = open('bueaty.jpg', 'rb') content = f1.read() f1.close() # 以二进制方式写入非字符内容 f2 = open('bueaty_copy.jpg', 'wb') f2.write(content) f2.close()
文件的写入操作
''' 读的方法 f = open(filename, mode, encoding) 1.全部读取 f.read() 2.r只读模式下;r模式下,n单位为字符,rb模式下,n单位为字节 f.read(n) 3.按行读取 1.读取单行 r.readline() 2.读取多行,返回一个列表类型 r.readlines() 3.如果指定了一个非负数的参数,则返回指定大小的字符数,包括 "\n" 字符。 r.readline(n) 4.循环读取:最优读法,每次在内存中只读取一行,读完转换后会释放内存。 for line in f.readlines(): print(line) ''' f = open("file_read.txt", encoding='utf-8') # 1.读取全部内容 data = f.read() # 2.读取单行 data = f.readline() # 3.读取多行,返回一个列表类型 data = f.readlines() # 3.读取前多少行 data = f.readline(5) print(data) f.close()
文件的追加操作
''' 文件的追加: 追加写入方法: a:创建写模式:文件名不存在,则创建写;存在则清空内容在写入 ab:以二进制的模式追加写入 a+:可追加写,可读 f = open(filename, mode, encoding) ''' data = 'asdfasdf' lis = ['asd','sadf','adsf'] with open('file_write.txt','a',encoding='utf-8') as f: f.write(data) # 在文件末追加写入 f.writelines(lis) # 在文件末写入多行
文件的其他操作方法:
''' 对文件句柄(数据流)的操作方法 f = open(filename, mode, encoding) f.read(): 读取全部内容 f.readline(): 读取单行 f.readlines(): 读取多行 f.close(): 关闭文件 f.flush(): 刷新文件,更新改动内容 f.readable(): 判断文件是否可读 f.writable(): 判断文件是否可写 f.seekable(): 判断光标是否可指定 f.seek(n): 根据字节数指定当前光标位置 f.tell(): 获取当前光标在文件中的位置 seek tell应用于网络编程:FTP的作业,断电续传的功能。 f.truncate(size): 对原文件根据字节大小进行截取,必须在句柄可写(r+)的情况下使用,使用r+模式 ''' # f.truncate() # f = open('other_operate.txt', 'r+', encoding='utf8') # f.seek(3) # 调整光标对truncate方法不管用 # f.truncate(9) # truncate截取都是从文件最开始位置进行截取,以字节为单位。 # f.close() ''' 总结: 最常用的几个方法:read seek tell flush readable writeable ''' ''' 打开文件的第二种方法: with open(filename, mode, encoding) as f: f.read() # 注意缩进 优点 1.省略f.close() 2.一个with open语句可以操作多个文件句柄 with open(filename1, mode, encoding) as f1,\ open(filename2, mode, encoding) as f2: 缺点: 当在打开文件中继续操作文件时,可能由于执行语句没有执行关闭文件,下面继续调用会出现报错(IOError) with open(filename1, mode, encoding) as f1: 对文件的处理 f.close() with open(filename2, mode, encoding) as f2: pass ''' with open('file_read.txt', encoding='utf-8') as f: data = f.read() print(f.tell()) print(data)
3.文件的修改操作原理
# 1.以读的模式打开一个源文件 # 2.以写的模式创建一个新文件 import os # 方法一 with open('file_modify.txt', encoding='utf-8') as f1,\ open('file_modify1.txt', 'w', encoding='utf-8') as f2: # 3.将原文件内容读取出来,按照你的要求改成新内容,写入新文件 # old_content = f1.read() # 慎用read()读取全部,推荐使用for # new_content = old_content.replace('alex', 'sb') # f2.write(new_content) for line in f1.readlines(): new_line = line.replace('alex', 'sb') f2.write(new_line) # 4.删除原文件 os.remove('file_modify.txt') # 5.将新文件重命名为原文件 os.rename('file_modify1.txt', 'file_modify.txt') # 或者 os.replace('file_modify.txt', 'file_modify.txt') # 方法二 with open('file_modify.txt', 'r+', encoding='utf-8') as f: file = f.read() f.seek(0) f.write(file.replace('sb', 'alex'))
衣带渐宽终不悔,为伊消得人憔悴!