创建文件句柄
'''
1. open是操作系统的指令
2. 文件路径: xx/xx/xx.txt, 可以使用绝对路径或者相对路径, 路径中出现反斜杠会报错, 推荐在引号前加r(全部转义)
3. 打开编码方式: 跟随系统, windows默认编码是gbk, linux和mac默认编码是utf-8
4. 动作: 读/写/追加, mode默认模式为r(只读模式)
5. 文件句柄常用命名: f1 / file / f_handle / file_handle / f_obj
'''
with open ( "xx/xx.txt" , encoding= "utf-8" , mode= "r" ) as f:
f1 = open ( 'xx/xx/xx.txt' , encoding= 'utf-8' , mode= 'r' )
f1. close( )
操作模式
参数 描述 r / rb 只读 w / wb 只写 a / ab 追加 r+ / r+b 先读后追加, 避免使用 w+ / w+b 先写后读, 避免使用 a+ / a+b 避免使用
r 模式 (只读)''' 原文件: utf-8编码的"中国" '''
with open ( "a.txt" , "r" , encoding= "utf-8" ) as f:
print ( f. read( ) )
rb 模式 (不做编码转化的只读, 一般用于操作非文字类文件, encoding参数可以不写)''' 原文件: utf-8编码的"中国" '''
with open ( "a.txt" , "rb" ) as f:
print ( f. read( ) )
w 模式'''
1. 若文件不存在, 则创建文件, 并写入内容
2. 若文件存在, 则清空文件内容, 并写入内容
'''
with open ( "c.txt" , encoding= "utf-8" , mode= "w" ) as f:
s = "写入内容"
f. write( s)
wb 模式''' 写入 bytes 格式的文件, 常用于写入图片等非文本文件 '''
with open ( "b.txt" , mode= "wb" ) as f:
s = "写入内容"
content = s. encode( "utf-8" )
f. write( content)
a 模式'''
1. 若文件不存在, 则创建文件, 并写入内容
2. 若文件存在, 则直接在文件末尾写入内容
'''
with open ( "c.txt" , encoding= "utf-8" , mode= "a" ) as f:
s = "写入内容"
f. write( s) )
ab 模式''' 追加 bytes 格式的文件 '''
with open ( "c.txt" , mode= "ab" ) as f:
s = "写入内容 2"
content = s. encode( "gbk" )
f. write( content)
常用方法
读文件
for 循环 - 逐行读, 末尾自动退出''' 读到末尾自动退出 '''
with open ( "a.txt" , "r" , encoding= "utf-8" ) as f:
for i in f:
print ( i)
read() - 读全文"""
不传参, 读取全文
传参, 如果是 r 模式, 最小元素为字符, 如果是 rb 模式, 最小元素为字节
"""
with open ( "a.txt" , "r" , encoding= "utf-8" ) as f:
print ( f. read( ) )
print ( f. read( 10 ) )
readline() - 逐行读, 末尾持续返回空行''' 一行一行读, 从第一行开始, 不会自动停止 '''
with open ( "a.txt" , "r" , encoding= "utf-8" ) as f:
print ( f. readline( ) )
print ( f. readline( ) )
readlines() - 不推荐使用, 可能导致内存溢出'''
读取全文, 每一行内容作为列表的一个元素, 可能导致内存溢出, 不推荐使用
readlines可以设定读取的最大字节大小 readlines(sizehint)
'''
with open ( "a.txt" , "r" , encoding= "utf-8" ) as f:
print ( f. readlines( ) )
写文件
write() - 全部写入"""
全部文本写入
可写单行, 可写多行
"""
s = """fajdifopajeipafeajfpoa
wjeifopajefi
ajfiep
附件eipafeifoj
"""
with open ( "b.txt" , mode= "w" ) as f:
f. write( s)
writeline() - iterable 写入""" 将 iterable 依次写入 """
s = [ str ( i) for i in range ( 30 ) ]
with open ( "b.txt" , mode= "w" ) as f:
f. writelines( s)
flush() - 立即写入, 刷新缓冲区"""
刷新缓冲区,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用该方法。
"""
import sys, time
for i in range ( 10 ) :
sys. stdout. write( "*" )
sys. stdout. flush( )
time. sleep( 0.2 )
光标的使用
""" 文件内容: content """
with open ( "c.txt" , mode= "r" ) as f:
f. seek( 3 )
f. tell( )
print ( f. read( ) )
f. seek( 0 , 0 )
print ( f. read( ) )
f. seek( 0 , 2 )
print ( f. read( ) )
用于容错判断
f. readable( )
f. writable( )
f. seekable( )
示例 - 修改文件
import os
''' 方法1, 用for语句逐行读取内容, 不会占用过大内存, 推荐使用 '''
with open ( "xx.txt" , encode= "utf-8" , mode= "r" ) as f1, open ( "xx.bak" , encode= "utf-8" , mode= "w" ) as f2:
for i in f1:
new_content = i. replace( "old_str" , "new_str" )
f2. write( new_content)
os. remove( 'xx.txt' )
os. rename( 'xx.bak' , 'xx.txt' )