文件基本操作
路径
1.绝对路径
绝对路径就是平常在该文件属性处(右击该文件会出现属性选项)
常规里的位置并不是该文件的绝对路径,这个只是该文件存放的位置,想查看他的绝对路径需要点击常规旁边的安全。进入这个界面。
这里的对象名称就是这个文件的绝对路径啦。平常用绝对路径打开文件等就相当于直接告诉电脑这个文件在哪是什么,电脑就可以很方便的找到了。
这边要注意一点:\在程序中会被认为是转义符,这样会影响路径的寻找。因此在平常使用路径的时候我们一般用r来取消转义。
(如:r’C:\Users\Ice\Desktop\a.txt’)
2.相对路径
相对路径顾名思义就是相对路径,所以他就是相对路径。
不开玩笑了,相对路径的意思就是相对所运行代码的路径。如果直接写"a.txt"
则代表着和该代码同一个文件夹下的一个名称为a的txt文件。当然一般我们会在路径前加一个'./'
表示该路径为相对路径。如:"./a.txt"
。
相对路径有一点好处是,在代码移植到其他电脑时,使用绝对路径会出现其他电脑不存在该路径的问题,但是相对路径就不需要考虑这些。
这里顺便提一下相对该代码上一级的路径命令是"../"
文件的操作
1.文件的打开
使用python内置的open函数可以打开文件进行操作,当然执行什么样的操作也是需要你告诉电脑的。
常见的操作有:
r 只读
w 写入(每次打开都会清空之前的内容)
a 追加
b 二进制打开
+ 更新(读和写)
当使用r读文件,文件又不存在时,会产生报错。但是用w打开文件如果文件不存在时会自动新建一个设定的文件。
file1 = open("./a.txt", 'w') # 自动新建a.txt文件并且以读写方式打开
可以看到open函数第一个参数是文件名,其实如果是该文件的路径也是可以的。第二个参数表示打开的方式。
2.文件指针
在讲文件读写之前,我们先学一下文件指针。
通常我们在打开文件的时候,会出现一个光标在文件最开始的位置不断闪烁,这个也就是文件指针的位置。但是文件的写入和我们平常的写入不同,因为文件读写是从文件指针的位置开始读写的,并且每读写一个字符,指针就会后移一个字符。(重点!重点!重点)
当文件指针初始所指的位置存在值的时候,此时写入数据就会覆盖该值。
使用seek函数可以往回移动文件指针的位置。
file1.seek(0) # 把文件指针移至文件开头
3.文件的写入
在python中,我们使用write函数实现写入数据到文件中。
file1 = open("./a.txt", 'w') # 自动新建a.txt文件并且以读写方式打开
file1.write("hello world!")
当然有时候我们需要写入多条数据,这时就可以使用writelines函数。
file1.writelines(["this", " is", " python"]) # 该函数的参数是一个可迭代对象。
运行完程序后,此时再打开a.txt文件。有些电脑a.txt里面没有内容,有些电脑里会有内容。如果没有内容的话,是因为我们在写入信息时忘记保存信息。而有些有内容的应该是电脑自动保存了,这点有待考究。那文件任何保存内容呢?
4.文件的保存
我们使用flush函数来保存内容。
file1.flush()
但是一般我们保存文件只需要最后保存一次。所以我们使用关闭文件指令在关闭文件时也会自动保存。
5.文件的关闭
文件关闭函数close,打开的文件记得关闭这是一个好习惯。
file1.close()
这样文件就会自动保存并且关闭了。
文件的打开方式
1.文件的追加
前面我们提到通过w写内容到文件中有个缺点,就是每次打开文件时都会清空源文件的内容。这导致运行多次程序后均只为最后一次运行的结果。那如果我们不想每次打开都清楚内容怎么办?
我们只需要将w改成a即可,此时为以追加的方式打开文件。
file1 = open("./a.txt", 'a') # 自动新建a.txt文件并且以读写方式打开
file1.write("hello world!")
file1.close()
这样每次执行程序都会在末尾加上hello world!
但是他每次都只在末尾添加,导致只有一行,那我们要实现换行的话可以加上转义字符’\n’。
file1.write("\nhello world!")
这样每次都会换行了。
2.文件的读取
首先文件必须可读
file1 = open("./a.txt", 'r') # 以只读的方式打开文件
利用read函数读取文件内容,默认一次读取全部内容并以字符串的形式返回。
a = file1.read()
也可以传入参数表示读取指定长度的数据。
a = file1.read(10)
如果想要读取一行的数据,还得需要readline函数
a = file1.readline()
同理读取多行内容就可以用readlines函数
a = file1.readlines() # 读取全部内容并把每行内容分为一个元素存放至列表中。
结合上面写入的writelines函数可以看出实现文件的复制还是很简单的。
3.文件的更新
把前面的r的后面补上+即可以可读和可写的方式打开文件。
file1 = open("./a.txt", 'r+')
此时不仅可以使用read函数还可以使用write函数了。
如果说每次都只想在文件末尾添加内容,那么可以使用a+。
file1 = open("./a.txt", 'a+')
4.二进制形式打开文件
在前面的a或r之后补上b则代表以二进制的方式打开文件。
file1 = open("./a.txt", 'ab+') # 以二进制的方式追加打开可读写的文件
此时则不能直接输入字符串了,写入的时候就必须先转换为二进制的形式才能写入。很简单只需要在字符串前面加一个b就好了。
file1.write(b"hello world")
5.文件自动关闭(上下文管理器)
with open语句可以实现自动关闭文件,其用法类似文件的定义。
with open("./a.txt", 'a+') as file1:
file1.seek(0)
a = file1.read()
print(a)
在缩进结束文件就自动关闭。上述实现输出文件a中的所有内容。
文件流
有时候我们只需要对文件进行快速的大量读取比如爬虫等,按照传统的写入读出效率将会特别慢,这时候就需要使用文件流了。
使用文件流需要导入IO模块。
import io
1.文件流定义
文件流就是临时的假文件,他通过下面的方式定义。
str_io = io.StringIO() # 生成字符串形式的临时假文件
其生成的文件可以进行正常的读写操作。
str_io.write("hello world!!!")
str_io.seek(0) # 这句很重要
a = str_io.read()
print(a) # hello world!!!
当然文件流里也有一些方便的内置函数,使用getvalue函数可以从头读取文件内容。
str_io.write("hello world!!!")
a = str_io.getvalue()
print(a) # hello world!!!
同理也存在二进制文件流的定义,于字符串文件流类似这边就不写出了。
文件目录的操作
对文件目录进行操作需要于操作系统交互,因此需要导入os模块。
import os
1.获取当前路径
a = os.getcwd() # C:\Python\text
print(a)
此时就会打印出当前的路径了。
2.切换路径
切换路径可以使用chdir函数,前提是切换后的路径必须存在哦。
os.chdir(a+"\\aaa")
a = os.getcwd() # C:\Python\text\aaa
print(a)
3.查看文件和子目录
使用listdir函数查看目录并以列表方式返回,默认是当前目录,当然也可以传入目录。
a = os.listdir(r"C:\Python\text\aaa") # 指定目录
print(a)
a = os.listdir() # 当前目录
print(a)
4.创建和删除文件夹
使用mkdir函数在当前目录下创建文件夹。
os.mkdir("bbb")
os.makedirs(r"bbb\ccc") # 创建多层目录的文件
同理rmdir就是删除文件夹的函数,但是他只能删除空的文件夹。
os.rmdir("bbb")
os.removedirs(r"bbb\ccc") # 删除多层目录的文件
5.调用系统命令
直接上代码。
os.system('cmd') # 调用系统的cmd
os.system('python') # 调用系统的cmd并进入python环境
6.文件的删除
还是熟悉的remove函数
os.remove(r"C:\Python\text\a.txt") # 指定路径删除文件
7.文件的重命名
想换名字了可以使用rename方法。
os.rename('a', 'aa') # rename(原文件名, 新文件名)
8.路径的拼接
我们使用path实现对路径的拼接。
os.path.join("C:/Python/text", "aaa") # 与join连用path.join.(路径1, 路径2)
文件的重点
今天的内容有点多,帮你们梳理了一下比较重要的知识点。
- 文件指针!每次读写操作都要注意一下文件指针的位置,防止数据误覆盖,或者读取信息缺失等问题。每次读写都会使文件指针后移。
- 文件的关闭!
- 文件流
结束语
本篇文章内容较多就不布置作业了。
各位看官点个赞吧,这对我非常重要。
ps:现在关注我,以后就是老粉啦!!!
下篇预告
我们写代码的时候要写很多函数来辅助实现,比如上面提到的remove函数,那每次写一个代码就要重写这么多函数,即使是复制粘贴也会大大增加代码量,可是这该怎么办呢……