python学习之文件操作

4.3 文件操作

4.3.1 初识

语法:f = open('文件路径',mode='模式',encoding='编码')

open:调用操作系统打开文件

mode:对文件的操作方式;默认使用只读模式;b表示以字节的方式打开

encoding:文件编码;以字节的方式打开文件时,可以不用加encoding

​ windows使用的是GBK,mac OS和nuix使用的是UTF-8;UTF-8是最常用的编码集

f :文件句柄,给读取的文件一个标记,用于文件操作

所有的操作公用一个光标,read命令执行按照光标所在文件位置往下进行,

mode 描述 mode 描述
r 只读 默认模式,文件不存在时报错 w 只写 不可读;文件不存在时则创建;文件存在时则清空内容
r+ 读写 可读可写;先读后写 w+ 写读 可写可读,文件不存在时则创建;文件存在时先清空内容
rb 只读 读取的数据类型是Bytes;在rb模式下,不能选择encoding字符 wb 只写 写入的数据类型是Bytes
r+b 可读可写,数据类型是Bytes w+b 可读可写,数据类型是Bytes
a 追加只写 w文件不存在时则创建;
文件存在时则只追加内容
a+ 追加写读 可写可读
ab 追加可读 数据类型是Bytes a+b 数据类型是Bytes
x 只写 不可读;文件不存在时则创建;<文件存在时则报错 x+ 写读 可写可读

带b的模式是是打开非文本文件时使用的。

4.3.2 只读操作r,rb

r读文本文件,rb读取非文本文件

f=open('D:mayungerencangkuday01ceshi.txt',mode='r',encoding='UTF-8')
s = f.read()   #全部读取,按照字符读取;光标位于文件尾部
s1 = f.readline() #读取一行
print(s1,)  
s2 = f.readlines()  #按行为以列表的形式输出
print(s2)
for i in f:  #迭代读取,该方式较为安全,能够防止内存溢出
    print(i)
f.close()   #操作完之后,关闭文件

tips:

​ .read() ---括号里不给数字是默认全读,全部读取时应防止文件过大造成内存溢出;如果()给出数字就表示读取相应的字符数,这里请注意,换行符占一个字符;

​ .readline() ---按行进行读取;添加参数,表示读取本行前几个字符

​ .readlines() ---按行进行全部输出,输出为列表

​ .close() ---把打开的文件关闭,良好的习惯

​ for循环读取能够防止内存溢出

​ 注意使用r,防止转义,如下例:

f = open('C:/Users/lenovo/Pictures/Saved Pictures/timg.jpg',mode='rb',)

f = open(r'C:UserslenovoPicturesSaved Pictures	img.jpg',mode='rb',)
注意的问题:

open()文件时:

​ 1.路径一定要正确,确保文件后缀正确;

​ 2.如果没有设置encoding的话,默认跟随系统走,Windows使用的是GBK,此时如果文件使用的是UTF-8,那么打开时会报错;

​ 3.带b模式打开文件时,不能指定encoding;

4.3.3 写操作w,wb,a

.write()

​ 在带w的模式下第一次执行write的时候,会先清空原来的内容,之后可正常write;

​ 如果没有该文件,则创建新的文件;

​ 在a模式下,不清空文件,为实在文件末尾进行添加

.flush() 刷新输入管道,把内存中的文件刷到硬盘中,关闭文件前使用

f = open('D:mayungerencangkuday01ceshi.txt',mode='a',encoding='UTF-8')
f.write('hahaha')
f.flush()  #刷新输入的管道
f.close()  #关闭文件

wb模式下,可以不指定打开⽂件的编码,但是在写⽂件的时候必须将字符串转化成utf-8的bytes数据

f = open("小wa娃", mode="wb")
f.write("金毛狮王".encode("utf-8"))

文件拷贝

用r模式打开一个文件,把内容读取写到一个用w模式打开的文件中

f = open('C:/Users/lenovo/Pictures/Saved Pictures/timg.jpg',mode='rb',)  ##注意这里的文件路径使用的是unix方式
f1 = open('d:/ceshi.jpg',mode='wb',)#内存使用率高
f1.write(f.read())
for line in f:  #这种方式比较安全,文件过大时,防止内存溢出
    f1.write(line)
f.close()
f1.flush()
f1.close()

4.3.4 文件路径

1.绝对路径

​ 1.从此盘根目录寻找

​ 2.网络上的路径

2.相对路径

​ 相对于当前程序所在的文件夹,去到其他的文件,实际应用较多,相对安全。

import  os
print(os.getcwd())  #查看绝对路径

​ ../去上一级文件夹

f = open('../ceshi/ceshi.txt',mode='r',encoding='UTF-8')
s = f.readline()
print(s)  

4.3.5 r+ w+ a+

r+模式

f = open('../ceshi/ceshi.txt',mode='r+',encoding='UTF-8')
s = f.readline()
f.write('jjzz')
#s = f.readline()
print(s)
f.flush()
f.close()

注意大坑:在r+模式下,若果没有执行read操作,默认是从文件的开头进行write,把原来的内容覆盖;如果有read操作,把无论读了多少字符,write都会把内容写在文件的末尾。

正确用法:先读再写

w+模式

​ 用的很少,因为写入前要先清空文件

正确用法:先写后读,读的时候配合f.seek()光标移动到开头进行查看

a+模式

4.3.6 操作方法

1.光标

r 模式下,光标默认在文件在最开头,每读一次,光标往后是动一次,单位是字符。

w 模式下,因为要先清空文件内容,光标会停在文件开头

a 模式下,追加模式,光标在文件末尾

.tell()可以查看光标在哪里,tell的单位是字节

.seek()的单位也是字节

光标移动到末尾:seek(0,2),第一个参数:偏移量;第二个参 数:位置

seek(偏移量,位置) 当前位置表示:0开头;1当前位置;2末尾

2. 截断文件

.truncate()把光标后边的内容删掉

.truncate(12)给参数之后,截断到光标位置

4.3.8 其他功能

.fileno()返回文件句柄在内存中的索引值

.flush()把文件从内存中强制刷到硬盘

.readable()判断是否可读

.writeable()判断文件是否可写

4.3.9 with open()

语法:with open ('文件路径',mode='模式',encoding='编码') as f

with open ('111.txt',mode='r',encoding='utf-8')  as f ,
open ('222.txt',mode='w',encoding='utf-8') as g :  
	s = f.read
	print(s)

tips:打开多个文件时,代码较多可以在代码中间加一个 然后换行即可。

with open ()面向对象中上下文管理

使用的参数与open一致

优势:

​ 能够自动关闭文件;

​ 能够同时打开操作多个文件;

​ 能够同时用r和w操作同一个文件;

4.3.10 修改文件

with open (路径,模式,encoding) as 变量名,open(路径,模式,encoding) as 变量名2:  
import os
for line in f1 :
	new_line = line.replace('aa','bb')
	f2.write(new_line)
os.remove('文件名1')   
os.rename('文件名2',‘文件名1)

注意:实际应用时,不要轻易使用.remove ,我们可以对老文件进行rename进行重命名作为备份。

仅供参考,欢迎指正
原文地址:https://www.cnblogs.com/jjzz1234/p/11032183.html