python基础08文件操作

发布时间:2026/7/3 7:54:47
python基础08文件操作 一、文件操作核心概念先明确几个概念概念含义文件路径文件在系统中的位置绝对路径相对路径文件模式打开文件的方式读写追加等文件对象打开文件后返回的对象用于后续读写操作,通过open()函数获取编码格式文本文件的字符编码,utf-8,gbk,决定能否正确读写中文等特殊字符二、基础文件操作open() 与文件对象open()函数是文件操作的入口用于打开文件并返回文件对象然后使用对象.方法就能完成日常的操作open()函数参数详解open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone)核心参数作用说明常用取值file必选文件路径,字符串data.txtmode打开模式决定读写权限和文件类型r,w,a,r,wbencoding文本模式下的编码格式(二进制模式无需指定使用b)utf-8(支持中文),gbk文件模式总表分类完整模式默认缩写常用形式数据格式读写权限文件存在性处理操作后指针位置⚠️ 易错点只读rtr默认文本只读必须存在否则报错不变仍在开头 0只读模式指针不会移动除非显式 read()只读rbrb二进制只读必须存在否则报错不变仍在开头 0非文本文件必用read() 后指针才会移动只写wtw默认文本只写不存在则创建存在则清空开头0清空后写入写完后指针在内容末尾但再次打开/刷新后回到开头只写wbwb二进制只写不存在则创建存在则清空开头0写入 bytes 后指针移动关闭后重新打开才可见追加ata默认文本只写不存在则创建存在则保留末尾文件结尾无论 write() 前指针在哪写入始终在末尾追加abab二进制只写不存在则创建存在则保留末尾文件结尾适合日志追加write() 后指针在新末尾读写保留原内容rtr默认文本读写必须存在否则报错开头0写入会覆盖当前位置内容需配合 seek()读写保留原内容rbrb二进制读写必须存在否则报错开头0精确修改二进制数据需 seek() 定位字节读写清空原内容wtw默认文本读写不存在则创建存在则清空开头0清空后写入写完后指针在末尾读取前需 seek(0)读写清空原内容wbwb二进制读写不存在则创建存在则清空开头0新建并编辑二进制文件写后需 seek(0) 再读追加读ata默认文本读写不存在则创建存在则保留末尾文件结尾写入在末尾读取前必须 seek(0)否则读空追加读abab二进制读写不存在则创建存在则保留末尾文件结尾追加后验证文件完整性读前需 seek(0)r/rb只读如果不调用read()指针始终不动w/wb清空后指针在开头但写入后指针会移动到内容末尾a/ab无论怎么操作指针始终在末尾核心规则(一句话看懂)r只读文件不存在报错w写文件不存在创建覆盖写入a是文件不存在创建追加写入二进制模式(b),就是针对一些mp3,mp4,JPGpng这些文件需要加上b,否则报错基础操作流程打开---操作---关闭推荐使用with 语句自动关闭文件无需手动调用close()文本文件读写# 写入文件 with open(123.txt,w,encodingutf-8) as f: f.write(hello world\n) f.write(这首中文内容\n) # 这个有个误区一次性写入2行数据如果下次再使用了w模式的话就会将这2行的内容覆盖当前代码不会覆盖是一次性写了2行内容 # 读取文件 with open(123.txt,r,encodingutf-8) as f: content f.read() print(f文件内容\n{content}) # 输出为 # 文件内容 # Hello, Python! # 这是中文内容二进制文件操作(图片视频)二进制文件必须用b模式且无需指定encoding(这个是文本才能使用的)复制一个图片流程读取这个图片保存到一个变量中然后将这个变量写入到另外一个图片中完成图片复制# 先读取保存这个内容 with open(1.jpg,rb) as f: data f.read() # 将内容写入到另一个图片中 with open(2.jpg,wb) as f: f.write(data) print(图片复制完成)上面这个图片案例视频可以就是可以利用到爬虫上读取内容即可三、文件读取的5种方式方法功能说明文件指针变化适用场景read()无参读取文件全部内容有参 n读取至多 n 字节二进制模式常用文本模式需谨慎无参从当前位置直读到 EOF指针停在文件末尾有参 n向前移动 n 字节/字符。可配合seek()从指定位置读取小文件一次性处理全文二进制大文件分块处理如网络传输、分片复制readline()读取一行内容含换行符\n支持指定字节限制 limitPython 3.2从当前位置读到行尾指针移至下一行开头若已到 EOF 则保持不动按行处理文件如日志解析、CSV逐行读取超大行文件指定 limit 控制内存readlines()读取所有行返回列表每行作为元素含换行符\n从当前位置连续读取直至 EOF指针最终停在文件末尾中等大小文件需按行索引访问如按行号提取内容或批量处理所有行迭代文件对象for line in f自动逐行读取循环内每次返回一行含换行符\n底层调用readline()每次迭代指针向后移动一行循环结束后位于 EOF循环前可用seek(0)重新从头遍历大/超大文件内存友好无需一次性加载全部内容仅需顺序处理行数据readline() 默认带上一个换行符readlines() 读取所有行返回一个列表5种读取方式的对比with open(123.txt,w,encodingutf-8) as f: f.write(这个是第一行内容\n) f.write(这个是第二行内容\n) f.write(这个是第三行内容\n) # read 读取全部的内容 with open(123.txt,r,encodingutf-8) as f: print(f1. read()结果为\n{f.read()}) # 输出为 1. read()结果为 这个是第一行内容 这个是第二行内容 这个是第三行内容 # readline 读取一行的内容 with open(123.txt,r,encodingutf-8) as f: print(2. readline()结果为:) print(f.readline(),end) print(f.readline(),end) # 输出为 2. readline()结果为: 这个是第一行内容 这个是第二行内容 # readlines方法 with open(123.txt,r,encodingutf-8) as f: lines f.readlines() print(f3. readlines()结果为{lines}) print(f访问第二行根据索引:{lines[1]}) # 输出为 3. readlines()结果为[这个是第一行内容\n, 这个是第二行内容\n, 这个是第三行内容\n] 访问第二行根据索引:这个是第二行内容 # 迭代文件对象 with open(123.txt,r,encodingutf-8) as f: print(f5. 迭代文件对象) for line in f: print(f行的内容:{line},end) # 这个也是默认带上一个换行符因为文本内容自带一个换行符 # 输出为 5. 迭代文件对象 行的内容:这个是第一行内容 行的内容:这个是第二行内容 行的内容:这个是第三行内容四、文件写入的3种方式写入操作需要注意模式选择,w是覆盖a是追加以及换行符的处理方法功能说明write(str)写入字符串返回写入的字符数writelines(seq)写入字符串序列列表/元组等不自动添加换行符print(..., filef)用 print 函数写入可自动添加换行符end参数控制# write() 返回的是写入的字符数 with open(123.txt,w,encodingutf-8) as f: content1 f.write(这个是写入第一行的内容\n) content2 f.write(这个是写入第二行的内容) print(f写入的字符数:{content1},{content2}) # 输出结果为 写入的字符数:12,11 # writelines() with open(123.txt,a,encodingutf-8) as f: lines [\n写入到第三行的内容,用writelines写入第四行] f.writelines(lines) # 不会自动添加换行文件内容是连在一起的 # 文件内容为 这个是写入第一行的内容 这个是写入第二行的内容 写入到第三行的内容用writelines写入第四行 # print() 函数写入自动换行 with open(123.txt,a,encodingutf-8) as f: print(\n用print写入第五行:,filef) print(用print写入第六行,filef,end---) # 文件内容为 这个是写入第一行的内容 这个是写入第二行的内容 写入到第三行的内容用writelines 用print写入第五行: 用print写入第六行---五、文件指针与随机访问文件对象内部有一个指针记录当前读写位置通过移动指针可以实现随机读写(修改文件中间内容)方法/属性功能说明tell()返回当前指针位置字节数seek(offset, whence)移动指针到指定位置offset偏移量正数向后负数向前whence基准位置0文件开头1当前位置2文件末尾文件指针操作with open(123.txt,w,encodingutf-8) as f: f.write(0123456789) print(f写入指针后的位置:{f.tell()}) # 输出结果为 写入指针后的位置:10 # 移动指针到开头读取三个字符 f.seek(0,0) print(f移动到开头后读取:{f.read(3)}) # 输出为 012 print(f当前的指针位置:{f.tell()}) # 输出当前指针为3