【一】操作流程:
- 打开文件,得到一个文件句柄(对象),赋给一个对象。
- 通过文件句柄对文件进行操作。
- 关闭文件。
【 二 】 使用方法
open(路径 + 文件名,读写模式)
如下:
f = open("1.txt","a")
f.write("8")
f.write("9\n")
f.close()
使用追加的方式打开1.txt 赋值给f,追加89 然后关闭文件
with的作用
with open(file) as f:#对f进行文件操作
相当于
f = open(file)
#对f进行文件操作
f.close()
或者更严格的,相当于
f = open(file)
try:#对f进行文件操作
finally:f.close()
- with相当于一个智能化的'='赋值方法,其可以在最后来自动的关闭文件。
- 即使对文件f的操作报错,文件操作未进行,with可以仍然使得文件关闭。
【 三 】常用模式有:
1.打开文件的模式有(默认为文本模式):
r 只读模式【默认模式,文件必须存在,不存在则抛出异常】
w 只写模式【不可读;不存在则创建;存在则清空内容在写入】
a 只追加写模式【不可读;不存在则创建;存在则只追加内容】
2.对于非文本文件,我们只能使用b模式。
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码。
rb 以二进制读取
wb 以二进制写入
ab 以二进制追加
3.‘+’模式(就是增加了一个功能)
r+ 读写【可读,可写】
w+ 写读【可写,可读】
a+ 写读【可写,可读】
4.以bytes类型操作的读写,写读,写读模式
r+b 读写【可读,可写】
w+b 写读【可写,可读】
a+b 写读【可写,可读】
5.关于r+模式:打开一个文件用于读写,文件指针默认将会放在文件的开头。
注意:如果在读写模式下,先写后读,那么文件就会出问题,因为默认光标是在文件的最开始,你要是先写,则写入的内容会将原内容覆盖掉,直到覆盖到你写完的内容,然后在从后面开始读取。
# 文件'其他模式'中的内容是:王副班最帅# 1. 先读后写
f1 = open('其他模式', encoding='utf-8', mode='r+')
content = f1.read()
print(content)
f1.write('王强强')
f1.close()3 2. 先写后读(错误实例)
f1 = open('其他模式', encoding='utf-8', mode='r+')
f1.write('王强强')
content = f1.read()
print(content) # 最帅
f1.close()
【 四 】文件创建:
(1)使用open函数
Python内置了一个名为open的函数,它可以用于创建、打开和修改文件。
使用"new_file.txt"作为文件名,并使用"w"作为访问模式。其中,"w"代表写入模式,它会创建一个新文件,并允许写入内容。
(2)使用with关键字
在使用open函数创建文件时,我们需要手动关闭文件,以确保资源得到释放。为了简化这个过程,Python提供了一个更好的方式,即使用with关键字。示例如下:
with open("new_file.txt", "w") as file:# 在这里进行文件操作data = file.write('name is age 18')pass
( 3 )文件不存在时创建文件
import os
file_path = "new.txt"
if not os.path.exists(file_path):open(file_path, "w").close()print(f"文件 {file_path} 创建成功")
else:print(f"文件 {file_path} 已存在")
【 四 】读文件
( 1 ) open()方法读取
file = open('1.txt', 'r')
# 在此处进行文件读取操作
file.close()
( 2 )with语句读取
with open('1.txt', 'r') as file:content = file.read()print(content)
( 3 )read()方法
read()方法用于读取整个文件的内容,并将其存储为一个字符串。例如,要读取名为'file.txt'的文件的所有内容,可以使用以下代码:
file = open('1.txt', 'r')content = file.read()print(content)
( 5 ) readlines())方法
readlines()方法用于读取整个文件的内容,并将其存储为一个列表,列表中的每个元素表示文件中的一行。例如,要读取名为'file.txt'的文件的所有内容,可以使用以下代码:
file = open('1.txt', 'r')lines = file.readlines()for line in lines:print(line)
(6) readline()方法
readline()方法用于读取文件的一行内容,并将其存储为一个字符串。每次调用readline()方法会读取文件中的下一行内容。例如,要读取名为'file.txt'的文件的第一行内容,可以使用以下代码:
file = open('1.txt', 'r')line = file.readline()print(line)
【 五 】写文件
(1) 写入文件时的不同模式
- 覆盖模式(“w”):打开文件并将内容写入文件,如果文件存在,则覆盖原有内容。如果文件不存在则创建一个新的文件。
- 追加模式(“a”):打开文件并将内容写入文件,如果文件存在,则在文件末尾添加内容。如果文件不存在则创建一个新的文件。
- 读写模式(“r+”):打开文件供读取和写入,如果文件存在,则覆盖原有内容。如果文件不存在,将抛出
FileNotFoundError
异常。
(2)写入字符串数据
# 写入字符串数据
with open("1.txt", "w") as file:file.write("Hello, World!\n")file.write("This is a new line.")
(3)写入字节数据
- 使用
write()
方法将字节数据写入文件。 - 可以使用
encode()
方法将字符串转换为字节数据进行写入。
# 写入字节数据
with open("1.txt", "wb") as file:content = "Hello, World!\n"file.write(content.encode("utf-8"))
(4)writelines()
写入list内容,不会在元素之间自动添加换行符。
【 六】总结文件中的一些操作方法
f.read([size]) #size为读取的长度,以byte为单位
f.readline([size]) #读一行,如果定义了size,有可能返回的只是一行的一部分
f.readlines([size]) #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
f.write(str) #把str写到文件中,write()并不会在str后加上一个换行符
f.writelines(seq) #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西,包括换行符。
f.close() #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。 如果一个文件在关闭后还对其进行操作会产生ValueError
f.flush() #把缓冲区的内容写入硬盘
f.fileno() #返回一个长整型的”文件标签“
f.isatty() #文件是否是一个终端设备文件(unix系统中的)
f.tell() #返回文件操作标记的当前位置,以文件的开头为原点
f.next() #返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
f.seek(offset[,whence]) #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
f.truncate([size]) #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
【七】 文件的读写模式
【 八 】指针定位
tell() 方法用来显示当前指针的位置。
f = open('test.txt')
print(f.read(10)) # read 指定读取的字节数
print(f.tell()) # tell()方法显示当前文件指针所在的文字
f.close()
seek(offset,whence)方法用来重新设定指针的位置。
- offset:表示偏移量
- whence:只能传入012中的一个数字。
- 0表示从文件头开始
- 1表示从当前位置开始
- 2 表示从文件的末尾开始
f = open('test.txt','rb') # 需要指定打开模式为rb,只读二进制模式print(f.read(3))
print(f.tell())f.seek(2,0) # 从文件的开头开始,跳过两个字节
print(f.read())f.seek(1,1) # 从当前位置开始,跳过一个字节
print(f.read())f.seek(-4,2) # 从文件末尾开始,往前跳过四个字节
print(f.read())f.close()