Python文件管理
目录
一、文本文件读写
1、相关函数
2、读写文件
3、使用readline读取一行
4、读写文件的异常处理
5、添加内容
二、文本文件的编码
1、常见的编码
2、Python程序的编码
3、指定编码
三、文件的路径
1、相对路径
2、绝对路径
3、路径的改变
四、文件夹操作
五、文件和递归函数的结合应用
在Python中,我们可以用代码来对文件进行读写,删除,创建等操作
一、文本文件读写
1、相关函数
在Python中,有很多函数可以对电脑中的文件进行操作:
函数 | 功能 |
open() | 打开文件,并且会把返回值放到一个变量中,比如f |
f.write() | 写入文件 |
f.readlines() | 读取文件的全部内容 |
f.readline | 读取文件的一行内容 |
f.close | 关闭文件(很重要) |
f.read | 读取文件的全部内容,并且返回一个字符串,内部包含文件的全部内容 |
2、读写文件
下面我们来创建一个文件并在其中写入内容:
a = open("d:\\tmp\\t.txt" , "w") #"w"表示写入,用这种方式打开文件,若文件本来就存在,就会被覆盖
a.write("hello\n")
a.write("world\n")
a.close()
在这个代码中,我们在d盘的tmp文件夹下创建了一个文本文档,在里面进行了写入的操作,下面我们到电脑中去查看一下:
我们发现,在tmp文件夹下,有了刚刚创建的文本文档,并且也有我们刚刚要求输入的内容
注意!在这个例子中,“w”模式下,对文本文档进行写入操作,tmp文件夹必须存在,否则程序会出现错误!
就像这样:
现在我们已经会了如何写入一个文件,下面我们来看如何读取一个文件的内容:
a = open("d:\\tmp\\t.txt" , "r") #"r"表示读取
lines = a.readlines() #lines是一个字符串列表,里面的每一个元素是一行
a.close()
for i in lines :
print(i , end="")
输出:
在代码中,我们虽然在输出时添加了“end=""”,但是输出时还是带有换行,这是因为文本文档中每一行最后自带换行符,所以即使有end那一行的代码,输出也是换行的。
3、使用readline读取一行
我们也可以通过用while循环和readline函数来完成对文件的读取:
a = open("d:\\tmp\\t.txt" , "r") #"r"表示读取
while True :
data = a.readline()
if data == "" :
break
data = data.strip()
print(data)
a.close()
输出:
4、读写文件的异常处理
我们在用Python读写文件的时候,可能会因为文件不存在,而导致异常,而为了防止异常导致程序中断,我们可以结合try和except,来继续执行程序:
try :
a = open ("d:\\study\\t.txt" , "r")
lines = a.readlines()
a.close()
for i in lines :
print(lines , end="")
except Exception as e :
print(e)
我们要在D盘中打开study文件夹下的t.txt文件(但实际是不存在这个文件夹的),所以程序会执行
except后面的语句:
5、添加内容
在前面我们知道了,在“w”状态下,可以对某个文档进行写入操作,但如果这个文档之前存在,且里面有东西,里面的内容就会被覆盖,所以我们需要一个新的模式来能在不覆盖旧的内容的情况下,对文档进行写入操作,即“a”
a = open("d:\\tmp\\t.txt" , "a")
a.write("nihao\n")
a.write("Apple\n")
a.close()
当我们到文档中去查看的时候,发现文档下面多了两行,并且之前的文字没有被覆盖:
注意!在“a”模式下,如果文件不存在,就会创建一个文件,在文件内写入
二、文本文件的编码
1、常见的编码
我们常见的编码有两种,一个是gbk,另一个是utf-8,打开文件时,如果编码不正确,就不能正确的读取文件:
我们在另存文本文档时,会在下方看到默认的文件编码:
在上面的图片中,ANSI对应gbk
写入文件时,如果不指定编码,则用操作系统的缺省编码(默认编码)
(在Windows中是gbk,win10开始是utf-8,Linux和MacOS是utf-8)
2、Python程序的编码
在我们的电脑中,“.py”的文件必须保存成utf-8的编码格式,才能运行,如果存成了ANSI的编码格式,需要在文件的第一行加入:
#coding = gbk
3、指定编码
我们可以在写代码的时候就在里面直接指定读取写入文件的时候指定的编码:
并结合with语句:
with open("d:\\tmp\\t.txt", "w", encoding="utf-8") as a:
a.write("你好\n")
a.write("你好\n")
三、文件的路径
在我们电脑中,路径可以分为绝对路径和相对路径,相对路径的形式就是文件名没有包含盘符,而绝对路径的文件名就是包含盘符的
1、相对路径
相对路径不包含盘符,所以它的目录就是会默认在当前文件夹下,按照给的路径往下遍历:
这是一些相对路径的例子:
open("test.txt" , "r")
#文件在当前文件夹下
open("tmp\\test.txt" , "r")
#文件在当前文件夹下的tmp文件夹里
open("test\\tmp\\test.txt" , "r")
#文件在当前文件夹下的test文件夹下的tmp文件夹里面
open("..\\test.txt" , "r")
#文件在当前文件夹的上一层文件夹中
open("..\\..\\test.txt" , "r")
#文件在当前文件夹的上一层文件夹的上一层文件夹中
open("/tmp\\test.txt" , "r")
#文件在当前盘符的根目录下的tmp文件夹下
2、绝对路径
绝对路径就是包含盘符的,就上之前我们代码中的例子一样:
a = open("d:\\tmp\\t.txt" , "w")
(路径path也叫文件夹folder,或者目录directory)
注:
①运行程序时,会有一个“当前文件夹”,open一个文件的时候,如果不是绝对路径的形式,就都是相对与这个“当前文件夹”的
②而我们上面提到的这个“当前文件夹”,就是我们运行代码的py文件所在的文件夹
③程序是可以获取当前的文件夹的(需调用os模块)
例子:
import os
print(os.getcwd()) #os.getcwd()用于获取当前的文件夹
3、路径的改变
我们可以在程序的运行期间改变当前文件夹,这里需要调用os模块和一个函数
例子:
import os
print(os.getcwd()) #os.getcwd()用于获取当前的文件夹
os.chdir("d:\\Cplusplus")
print(os.getcwd())
输出:
四、文件夹操作
Python中为我们提供了丰富的函数来操作文件夹:
函数 | 作用 |
os.chdir(x) | 将程序的当前文件夹设置成x |
os.getcwd() | 求程序的当前文件夹 |
os.listdir(x) | 返回一个列表,里面是文件夹x中所有的子文件夹名字和文件名字 |
os.mkdir(x) | 创建文件夹x |
os.path.getsize(x) | 获取文件夹x的大小(单位:字节) |
os.path.isfile(x) | 判断x是不是文件 |
os.remove(x) | 删除文件x |
os.rmdir(x) | 删除文件夹x,x文件夹必须是空文件夹才能成功 |
os.rename(x,y) | 将文件夹或文件x改名为y,不但可以改名,还可以起到移动文件夹或文件的目的 |
shutil.copyfile(x,y) | 拷贝文件x到文件y若y本来就存在,就会被覆盖 |
五、文件和递归函数的结合应用
在上面的表格提到了,我们在删除文件夹的时候,该文件夹必须是空的才彳亍,所以我们现在要设计一个函数,先删除内部可能包含的文件,然后把文件夹变成空的再删除空文件夹:
import os
def DeleteProMax(path) :
lst = os.listdir(path) #将路径中的子文件夹和文件的名字返回成一个列表
for i in lst :
lujing = path + "/" + i #i不包括我们输入的路径
if os.path.isfile(lujing):
os.remove(lujing)
else :
DeleteProMax(lujing)
os.rmdir(path)
DeleteProMax("d://tmp")
例子2:
用递归函数获取文件夹的大小:
import os
def GetSizeTool(path) :
total = 0
lst = os.listdir(path)
for i in lst :
lujing = path + "/" + i
if os.path.isfile(lujing) :
total += os.path.getsize(lujing)
else :
total += GetSizeTool(lujing)
return total