目录
1. python操作txt文件的步骤
2. 什么是文件的内存对象(文件句柄)?
a)read()
b) 写文件 write()
3. 文件的读写的几种模式
3.1 r模式
3.2 r+ 模式:可读可写
3.3 w 模式只写,清空覆盖原文件
3.4 w+ 模式 -可读可写
3.5 a模式
3.6 a+模式
3. 文件路径
使用python读取一个txt文件的时候,相当于把这个文件从硬盘上,读取到了内存中。我们如果想要操作这个文件,是不是先要获取这个文件对象?只有获取这个文件对象后,才能够真正的去操作这个文件,不管是读取文件中的内容,还是向文件中写入内容。
这个“文件句柄”包含了文件的文件名、文件的字符集、文件的大小、文件在硬盘上的起始位置。
file = "..\data\pi_digits.txt"
file_object = open(file, mode='r')
#第一次read,返回结果是全部内容
file_object1 = file_object.read()
print("file_object-type:", type(file_object)) #
print("file_object1-type:", type(file_object1)) #
print("file_object1:", file_object1)
#第二次read,运行结果为空
file_object2 = file_object.read()
print("file_object2:", file_object2)
运行结果:
D:\PycharmProjects\Oasis_auto\zmytest
file_object-type:
file_object1-type:
file_object1: 3.1415926535
8979323846
2643383279
file_object2:
Process finished with exit code 0
当我们操作这个“文件句柄”的read()方法去读取文件的时候,这个句柄会从文件的开头位置,移动到文件的结束位置。如果不做任何操作,读取完毕之后,句柄就会停止在结束这个位置。
因此当我们再次读取文件的时候,该句柄是从结束这个位置,往后面读取内容。
由于后面没有任何内容,因此第二次读取为空。file_object2读到的为空
# 写
file="..\data\my_write.txt"
file_w = open(file, mode="w")
file_w.write("first") #第一次运行写入的内容
#file_w.write("second") #第二次运行写入的内容
file_w.close()
# 写
file="..\data\my_write.txt"
file_w = open(file, mode="w")
#file_w.write("first") #第一次运行写入的内容
file_w.write("second") #第二次运行写入的内容
file_w.close()
当每次运行写入的内容变化时,就会覆盖之前的内容,文件中是最新一次写入的内容
模式 | 可做操作 | 若文件不存在 | 是否覆盖 | 备注 |
r | 只读 | 报错 | 读全文 | |
r+ | 可读可写 | 报错 | 是 | 1.先写后读的话,是从头开始覆盖式写(如只修改了前面的字符,后面字符是不会被删掉的),类指针停留在写完的末尾,不是文档末尾, 2.先读后写的话是在原有文本后添加,相当于追加, 因为读完后类指针不在文件开头,读到哪在哪开始写 |
w | 只写 | 创建 | 是 | open()时文件内原始数据会被全部清空,新写入的数据覆盖 |
w+ | 可读可写 | 创建 | 是 | 只要执行open(file,w+),该文件内的内容就会被清空 |
a | 只写 | 创建 | 追加写 | 在原文件内容上追加写 |
a+ | 可读可写 | 创建 | 追加写 | a+模式打开时是以追加的模式打开的,这时候光标定位在最后 如果直接读,读出的内容为空;直接写是在原文件内容上追加 |
r+:先读后写的话是在原有文本后添加, 因为读完后类指针已经在最末尾了,如果是先写后读的话,是从头开始覆盖式写(如只修改了前面的字符,后面字符是不会被删掉的),类指针停留在写完的末尾,不是文档末尾,可以读出未被覆盖写的部分;
w+:为先写后读,先写完后使用f.seek(0)回到初始位置然后开始读,如果先读的话是读不出任何东西的,因为w+也是纯粹的覆盖写,在未使用写操作前文档是完全空白的,无论之前该文件里有什么。so ,只能先写后读。
只读,读出全文
1)先写后读 ,读到的内容是从写结束的位置开始,需要调整句柄位置
写是覆盖式写的
my_write.txt 起初是空文件
file="..\data\my_write.txt"
file_w = open(file, mode="r+")
file_w.write("123")
w2=file_w.read()
print(w2)
第一次运行,写入 “123”,此时print(w2) 运行结果为空,
为空的原因:当你写入内容后,文件句柄会放在写入内容的最后面,因此当你立即读取的时候,句柄会从上次内容最后的位置,朝后面读,因此读取为空。
如果想写入后立马读出全部内容,需要调整句柄位置
#先写后读,需要调整句柄位置,才能读到全文
file_w.write("123")
file_w.seek(0)
w=file_w.read()
print("w:",w)
my_write.txt 起初文件中的内容不为空,是:
ab cdefg
#原文件有内容,先写后读
file_w.write("123")
w2=file_w.read()
print(w2)
运行后,my_write.txt:
123 cdefg
write(): 是从头开始覆盖式写(如只修改了前面的字符,后面字符是不会被删掉的),句柄停留在写完的末尾,不是文档末尾,可以读出未被覆盖写的部分;
读会报错:
覆盖式写:文件内原始数据会被新写入的数据清空覆盖
file="..\data\my_write.txt"
file_w = open(file, mode="w")
file_w.write("123")
运行后:
只要执行open(file,w+),该文件内的内容就会被清空
只写,在原文件内容上追加写
打开时是以追加的模式打开的,这时候光标定位在最后
如果直接读,读出的内容为空:
a+模式下写入:
将文件名传给open()函数时,python会在当前执行的文件的目录下查找该文件,即file_read.py所在目录--zmytest目录下查找 pi_digits.txt
但是一般,会有专门存放文件的目录,不会和执行文件在同一个目录
当不在同一个目录下时,直接传递文件名就会报错。
with open('..\data\pi_digits.txt') as file_object:
contents=file_object.read()
print("contents:",contents)