Python中文件的操作
文件操作
Python提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用file对象做大部分的文件操作。
文件:硬盘中一块存储空间(虚拟的文件)
文件操作:根据文件名来操作硬盘的那块存储空间,操作方式 读read 写write
必需的三个步骤:
1.打开文件
2.操作文件
3.关闭文件
一、打开文件
必须先用python中的内置函数open()打开一个文件,创建一个file,相关的辅助方法才可以调用它进行读写。
file object = open(file_name,mode,encoding)
各个参数的细节如下:
file_name:文件路径加文件名,file_name变量是一个包含了你要访问的文件名称的字符串值。
mode:mode决定了打开文件的模式:只读,写入,追加等,默认文件访问模式为只读(r)。
encoding:设置编码方式。
二、操纵文件
模式 | 描述 |
---|---|
r | 以只方式打开文件,文件指针放在文件开头,这是默认值。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
b | 以二进制打开一个文件进行操作,与r,w,a合用,操作时不需要关心文件编码 |
+ | 打开一个文件用于读写。与r,w,a合用,对文件的操作决定于合用的方法。 |
操作文件的方法:
模式 | 描述 |
---|---|
file.close() | 关闭文件。关闭后文件不能再进行读写操作。 |
file.flush() | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
file.fileno() | 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
file.isatty() | 如果文件连接到一个终端设备返回 True,否则返回 False。 |
file.next() | 返回文件下一行。 |
file.read([size]) | 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
file.readline([size]) | 读取整行,包括 "\n" 字符。 |
file.readlines([sizehint]) | 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比sizeint较大, 因为需要填充缓冲区。 |
file.seek(offset[, whence]) | 设置文件当前位置 |
file.tell() | 返回文件当前位置。 |
file.truncate([size]) | 截取文件,截取的字节通过size指定,默认为当前文件位置。 |
file.write(str) | 将字符串写入文件,返回的是写入的字符。 |
file.writelines(sequence) | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
seek方法讲解
必须在b模式下操作,seek中偏移的是字节
方法:seek(偏移量, 偏移位置)
偏移量:移动的字节数,负数是结合模式1,2往前偏移
偏移位置:
-- 0 - 从文件开始位置开始偏移 | 1 - 从当前游标位置开始偏移 | 2 - 从文件末尾开始偏移
文件内容为“b'你好1234567890'”
游标读
with open('source.txt', 'rb') as f:
d1 = f.read(11)
print(d1)
# print(d1.decode('utf-8'))
当前游标的位置
print(f.tell())
游标操作 - 从末尾位置开始
f.seek(-3, 2)
d2 = f.read()
print(d2.decode('utf-8')) # 890
游标操作 - 从当前位置开始
f.seek(-3, 1)
d2 = f.read()
print(d2.decode('utf-8')) # 34567890
游标操作 - 从头开始
f.seek(3, 0)
d2 = f.read()
print(d2)
print(d2.decode('utf-8')) # 好1234567890
三、关闭文件
File对象的close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
当一个文件对象的引用被重新指定给另一个文件时,Python会关闭之前的文件。用close()方法关闭文件是一个很好的习惯。fileObject.close();
四、with方法
将文件的关闭交给with管理,当with中逻辑结束后,系统会自动释放文件
with open('file_name', 'model', encoding='utf-8') as f
pass
五、文件的复制就是先读再写
文本类型文件的复制
r = open('source.txt', 'r', encoding='utf-8')
w = open('target.txt', 'w', encoding='utf-8')
for line in r: # 遍历就是一行一行读 取读文件的流
w.write(line)
w.flush() # 将写入到内存中的数据刷新到硬盘中
w.close()
r.close()
用with open语法如何处理?
r+: 不会创建文件的可读可写 | w+:创建清空文件的可读可写 | a+:创建不清空文件(追加)的可读可写
with open('source.txt', 'r', encoding='utf-8') as f1:
with open('target.txt', 'a+', encoding='utf-8') as f2:
for line in f1:
f2.write(line)
如果复制非文本类型的数据文件?
从模式采用b模式,不需要关心编码问题
with open('source.mp4', 'rb') as f1:
with open('target.mp4', 'wb+') as f2: # rb+ | wb | wb+ | ab | ab+
for line in f1:
f2.write(line)