python 文件操作
本章所讲内容:
10.1 文件对象
10.2 文件权限
10.3 文件操作
10.4 os 模块
10.1 文件对象
10.1.1 文件介绍
什么是文件?
示例如下:
狭义说:文本文件;广义说:超文本文件, 图片,声音,超链接,视频
Python中可以使用一个文件对象file来做大部分文件操作,他有两个函数
file()在我们学习初期,file和open用法一样
open()想要读取或写入文件,必须使用python内置的open()函数来打开它,该函数创建一个文件对象,这将用来调用与之关联的其他支持方式
语法:
File object = open(path,mode,[buffering])
如何来创建一个文件对象
f = open()
path
文件路经,前期的时候我们写成固定的(绝对和相对路经),也可以使用os模块来辅助完成
mode权限
buffering(了解)
是否启用缓存 系统默认 -1 ; 0 不启用; 1启用行缓存
行缓冲就是说每一行刷新一次缓冲区,就是见到换行符的时候把缓冲区的内容送到指定位置
10.1.2 文件的作用
大家应该听说过一句话:“好记性不如烂笔头”。不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电脑之后,“哭了……”。可见,在把数据存储起来有做么大的价值。
使用文件的目的:
把一些数据存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
10.2 文件权限
案例:open('1.txt','r')
说明:
|
访问模式 |
说明 |
|
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
|
w |
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
|
a |
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
|
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
|
wb |
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
|
ab |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
|
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
|
w+ |
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
|
a+ |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
|
rb+ |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
|
wb+ |
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
|
ab+ |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
文件对象的属性(方法):
File.closed如果文件被关闭返回true,否则返回false
File.mode 返回文件被打开的访问模式
File.name 返回文件的名称
#以读的方式打开1.txt
f = open('1.txt','r')
#判断是否关闭
print(f.closed)
#打印权限
print(f.mode)
#打印文件的name
print(f.name)
#文件的关闭
f.close()
10.3 对文件的操作
10.3.1 文件读取(面试题)
1、遍历读取
文件对象本身可以迭代,并且以行的形式读取
f = open('1.py','r',encoding='utf-8')
for i in f:
print(i)
2、读取方法
调用方法read()会一次性读取文件的全部内容,但是如果文件有10G,内存就爆了,会导致程序卡死,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。
print(f.read(10))
3、readline每次读取一行
print(f.readline())
4. readlines,一次性以行的形式读取文件的所有内容并返回一个list,需要去遍历读出来。
print(f.readlines())
linelist = f.readlines()
for line in linelist:
print(line)
10.3.2 写
1. write
f = open('2.py','w',encoding='utf-8')
f.write('你好啊,hello,world')
f.close()
2. writelines
f = open('2.py','w',encoding='utf-8')
f.writelines(str(i)+'\n' for i in range(10))
f.close()
两者的区别在哪呢?
file.write(str)的参数是一个字符串,就是你要写入文件的内容.
file.writelines(sequence)的参数是序列,比如列表,它会迭代帮你写入文件。
3、close
close()方法并关闭一个已经打开的文件对象,文件关闭后不能再执行读写操作。
1、如果不去手动关闭文件,会一直占用我们的内存;
思考:如果读写文件出错,出现IOError的错误,我们后面的close()方法就不会调用,也就是说我们的文件就不会关闭,这个该如何?
解决:
- 我们可以用异常处理来解决(但是每次这么写很繁琐)
try 和 except 以及 finally在后面会讲到(先了解),打开已有的文件。
try:
f = open('1.txt', 'r',encoding='utf-8')
print(f.read())
except Exception as e:
print(e)
finally:
# #启用关闭,不启用,两种情况
# f.close()
pass
# #用于判断是否关闭
print(f.closed)
2、with
Python引入了with语句来自动帮我们调用close()方法
with open('1.txt','r') as f:
print(f.read())
with简单的导入原理(了解一下):
(1)紧跟with后面的语句被求值后,返回对象的“__enter__()”方法被调用,这个方法的返回值将被赋值给as后面的变量;
(2)当with后面的代码块全部被执行完之后,将调用前面返回对象的“__exit__()”方法。
class A:
def __enter__(self):
print('__enter__() is called')
#参数类型,类型,值,traceback(跟踪记录)
def __exit__(self, e_t, e_v, t_b):
print('__exit__() is called')
with A() as a:
print('got instance')
运行结果如下:
__enter__() is called
got instance
__exit__() is called
3、对图片文件进行操作
#图片文件以二进制形式打开,写入
with open('1.png','rb') as png1,open('2.png','wb') as png2:
png2.write(png1.read())
#第二种
with open('1.png','rb')as png1:
with open('2.png','wb')as png2:
png2.write(png1.read())
图片要以二进制读和二进制写
10.3.3 指针
1. tell() 方法返回文件的当前位置,即文件指针当前位置。
语法
tell() 方法语法:fileObject.tell()
f = open('1.txt','r+',encoding='utf-8')
#查看文件名
print(f.name)
#读取一行
line = f.readline()
print(line)
#获取当前文件指针的位置(字节)
pos = f.tell()
print('当前的位置%s'%pos)
f.close()
2. seek()
seek()方法用于移动文件读取指针到指定位置。
seek()语法格式:fileObject.seek(offset[, whence])
offset 移动的长度(字节)
whence 相对位置
0从开头(默认),1从当前,2从末尾
如果offset为负数,表示从后往前移动n个字节
案例:
f = open('1.txt','r+',encoding='utf-8')
#查看文件名
print(f.name)
#读取一行
line = f.readline()
print(line)
#指针移动到开头
f.seek(0,0)
line = f.readline()
print(line)
f.close()
10.3.4 实战
1、实战:电子书翻页功能
分析:电子书现在有自动翻页功能(死循环,深度循环);有手动输入功能(在深度循环中加入判断条件);
读取文章
import time
def reader(path,line = 3):
#打开文件
with open(path,'r',encoding='utf-8') as f:
#指针指向文件的末尾
f.seek(0,2)
#指纹末尾的位置
end = f.tell()
#指针又指向的文件开头
f.seek(0.0)
#处理开启自动
auto = str(input('是否开启自动:(y/n)?'))
#判断 自动
if auto == 'y':
#死循环,不断打印
while True:
#line= 3 循环三次
for i in range(line):
#每次打印一行
print(f.readline())
#为了视觉上的享受,我们停顿2秒
time.sleep(2)
#如果此时的指针指向最后一个字节
if f.tell() == end:
break
else:
#定义个变量N
con = 'N'
#指针指向末尾
f.seek(0,2)
#获取指针的位置(执行那个末尾的位置)
end = f.tell()
#指针指向开头
f.seek(0,0)
#开始循环
while True:
#如果判断可以
if con == 'N':
#循环三次 打印三行
for i in range(line):
print(f.readline())
else:
print('头铁是不?')
#判断 指针指向最后的位置
if f.tell() == end:
break
con = input('>>>')
reader('1.txt')
运行结果如下:
是否开启自动:(y/n)?n
当我还只有六岁的时候,在一本描写原始森林的名叫《真实的故事》的书中, 看到了一副精彩的插画,画的是一条蟒蛇正在吞食一只大野兽。页头上就是那副 画的摹本。
这本书中写道:“这些蟒蛇把它们的猎获物不加咀嚼地囫囵吞下,尔后就不 能再动弹了;它们就在长长的六个月的睡眠中消化这些食物。”
>>>N
10.4 os模块
10.4.1 Python系统路径和其他一些操作模块
|
os常用功能 |
|
|
os.sep |
符合当前系统的路径分割符,Linux/windows\ |
|
os.name |
返回操作系统类型windows“nt”Linux“posix” |
|
os.rename |
更改文件名,传递两个参数(旧文件名,新文件名) |
|
os.getcwd |
返回当前的工作目录 |
|
os.listdir |
列出指定目录下的目录和文件 |
|
os.chdir |
修改当前的工作路径 |
|
os.mkdir |
创建目录 |
|
os.makedirs |
递归创建目录 |
|
os.remove |
删除文件 |
|
os.rmdir |
删除文件夹(文件夹下内容为空) |
|
os.removedirs |
递归删除文件夹 |
|
os.system |
执行系统命令 |
|
os.popen |
执行系统命令,会将结果以文件的形式返回 |
|
os.walk |
通过在目录树中游走输出在目录中的文件名,向上或者向下 |
|
os.path.join |
连接目录和文件名。os.path.join(path,name) |
|
os.path. isfile |
判断指定对象是否为文件。是返回True,否则False |
|
os.path.isdir |
判断指定对象是否为目录。是True,否则False |
|
os.path. split |
返回路径的目录和文件名 |
|
os.path. exists |
检验指定的对象是否存在。是True,否则False |
|
os.path.getsize |
获取指定对象的文件大小 |
|
os.path.abspath |
获得绝对路径 |
|
os.path.basename |
返回文件名 |
|
os.path.dirname |
返回文件所在目录 |
1. os.name()——判断现在正在实用的平台,Windows 返回 ‘nt'; Linux 返回’posix'
rename(需要修改的文件名, 新的文件名) 也可以做剪切。
2. os.getcwd()——得到当前工作的目录。
3. os.listdir()——指定所有目录下所有的文件和目录名。
以列表的形式全部列举出来,其中没有区分目录和文件。
4. os.mkdir()——创建目录
>>>os.makedirs(‘a/b/c’)
5. os.remove()——删除指定文件
6. os.rmdir()——删除指定目录 :该目录不能为空
注意:这样只能建立一层,要想递归建立可用:os.makedirs(‘x/y/z’)
7. os.path.isfile()——判断指定对象是否为文件。是返回True,否则False
>>>os.path.isfile(‘1.txt’)
True
8. os.path.isdir()——判断指定对象是否为目录。是True,否则False。例
>>>os.path.isdir(‘1.txt’)
False
9. os.path.exists()——检验指定的对象是否存在。是True,否则False.例:
>>>os.path.exists(‘1.txt’)
True
10. os.path.split()——返回路径的目录和文件名。
此处只是把前后两部分分开而已。就是找最后一个'/'。看例子:
os.path.split('E:/xuegod/python3')
('E:/xuegod', 'python3')
11. os.getcwd()——获得当前工作的目录(get current work dir)
12. os.system()——执行shell命令。
13. os.chdir()——改变目录到指定目录(谨慎更改)
案例:
os.getcwd()
'E:\\workspace\\importTest'
path = '/tmp'
os.chdir(path)
os.getcwd()
'E:\\tmp'
os.chdir('E:\\workspace\\importTest'
)
os.getcwd()
'E:\\workspace\\importTest'
14. os.path.getsize()——获得文件的大小(字节),如果为目录,返回0
>>>os.path.getsize('1.txt')
1644
15. os.path.abspath()——获得绝对路径。
16. os.path.join(path, name)——连接目录和文件名。
例:
filepath = os.getcwd()
new_path = os.path.join(filepath,filename)
17.os.path.basename(path)——返回文件名
18. os.path.dirname(path)——返回文件所在目录
19. os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。在Unix,Windows中有效。
表达式:
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
top 代表的是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。
root 所指的是当前正在遍历的这个文件夹的本身的地址。
dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)。
files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)。
案例:
import os
#获取当前路径
path = os.getcwd()
#返回文件夹本身的地址,目录,文件
for root,dirs,files in os.walk(path):
for filename in files:
print(os.path.join(root,filename))
运行结果如下:
E:\workspace\importTest\1.png
E:\workspace\importTest\1.txt
E:\workspace\importTest\2.png
E:\workspace\importTest\2.py
E:\workspace\importTest\3.py
E:\workspace\importTest\class_test.py
E:\workspace\importTest\test01.py
10.4.2 如何批量修改文件夹下的文件名?
#获取该目录下的所有
m_name = os.listdir('./xuegod')
#对该目录下的文件遍历
for temp in m_name:
#新的文件名
new_name = 'xuegod'+temp
#更改文件名,前参数 代表老文件名,后面的参数代表新的文件名
os.rename('./xuegod/'+temp,'./xuegod/'+new_name)
10.4.3 实战
传入一个文件路径,得到该路径下所有的文件目录?(面试)
import os
def iterbrowse(path):
#返回路径,目录,文件;
for home,dirs,files in os.walk(path):
#对文件进行遍历
for file in files:
#拼接路径和name
print(os.path.join(home,file))
#处理当前的文件路径
new_path = os.getcwd()
#调用
iterbrowse(new_path)
输出结果如下:
E:\workspace\importTest\9_1_write_test.py
E:\workspace\importTest\9_2_with_test.py
E:\workspace\importTest\9_3_with_test02.py
E:\workspace\importTest\9_4_tell_test.py