当前位置: 首页 > Linux

[Python]-10-文件读写(上)

时间:2023-04-06 06:04:57 Linux

简介本文介绍如何使用python的os和shutil模块来读写、创建、删除文件或文件夹。文章目录0×1。文件相关操作创建文件B.读取文件内容C.文件内容追加D.文件读写异常e.获取文件扩展名f。获取文件绝对路径g.获取文件大小h。获取文件最近修改时间i.文件移动、复制、删除0×1。文件相关操作a.创建文件Python通过内置的open()函数创建文件。这个函数接收最基本的两个参数,第一个是文件路径(相对或绝对路径),第二个是文件的操作方法(读写)。创建文件有两种语法:语法一:file1=open("filepath","w")语法二:withopen("filepath","w")asfile1:其中file1是文件名file对象,参数“w”告诉python解释器创建一个可以写入数据的文件,并在关闭数据流之前,保持可写,语法二是python3.0推荐的标准方法。文件路径可以是相对路径或绝对路径。相对路径是相对于当前运行的脚本目录。windows下文件目录中的反斜杠需要进行转义输出,例如:"C:\windows\system32\filename.txt";或者使用参数前缀“r”取消字符串中反斜杠的特殊处理,例如:r"c:\windows\system32\filename.txt";本文所有操作均以ubuntu系统为例:#!/usr/bin/envpython#coding=utf-8#使用语法1、在“/home/qing/test/”目录下创建qingsword.txt文件,如果文件不存在则创建,如果文件存在则覆盖,file1.write()向该文件写入一行数据;如果不加参数“w”,则文件以只读模式传递给file1对象。在只读模式下,如果文件不存在,将触发“FileNotFoundError”异常。file1=open("/home/qing/test/qingsword.txt","w")file1.write("www.qingsword.com")file1.close()#关闭文件流delfile1#删除文件对象释放resources#如果要输入多行数据,可以使用三重引号,python会按照三重引号中的格式将每一行数据写入文件。三引号有点像HTML语言中的pre标签#使用语法2完成上述操作(推荐使用python3)#!/usr/bin/envpython3#coding=utf-8withopen("/home/qing/test/qingsword.txt","w")asfile1:file1.write("""Qingswordqingswordwww.qingsword.com""")注意到上面两个语法,语法2没有使用close()函数关闭文件流,这是因为with表达式包含了两个重要的函数,__enter__和__exit__,__enter__函数负责将open()函数的返回值赋值给后面的对象as(file1)。最后,无论语句块出现什么异常,离开时都会执行__exit__函数,这个函数会自动将打开的文件对象一个一个关闭。;这种设计的好处是显而易见的。语法1中,如果在close()函数执行前程序异常退出,文件流将不会正常关闭,会一直占用系统资源,所以推荐使用with来打开文件。本例中使用了语法2,相当于在文件中输入了三行数据,下面看看如何读取这些数据的内容。b.读取文件内容要读取文件,可以使用文件对象的read()和readline()方法。read()会一次读取所有文件内容,而readline()一次只会读取一行,如果文本中有换行符(\n),也会被读取,但在输出或写入其他文件时,这些换行符会自动转换为换行符,请看下面的例子:#!/usr/bin/envpython3#coding=utf-8importos#importosmodule#os.path.isfile()函数可以判断传入的路径是否为文件,open函数中的参数“r”表示打开文件在只读模式下ifos.path.isfile("/home/qing/test/qingsword.txt"):withopen("/home/qing/test/qingsword.txt","r")asfile1:line1=file1.readline()#读取一整行(以回车\n结尾)print(line1)line1=file1.readline()print(line1)line1=file1.readline()print(line1)#程序输出,每行输出的行之间有一个空行,这是因为“青刃”和“青剑”后有换行符“\n”,输出文本数据后光标移动到下一行,打印()函数默认会从一行开始输出,所以会往下移动另一行得到如下结果)过滤掉每行字符前后的换行符,如下#!/usr/bin/envpython3#coding=utf-8importosifos.path.isfile("/home/qing/test/qingsword.txt"):withopen("/home/qing/test/qingsword.txt","r")asfile1:line1=file1.readline().strip("\n")print(line1)line1=file1.readline().strip("\n")print(line1)line1=file1.readline().strip("\n")print(line1)#输出青剑www.qingsword.com#如果一行数据太多long,一次性读取可能会导致内存溢出,使用readline(字符数)读取指定字符数,例如#!/usr/bin/envpython3#coding=utf-8importosifos.path.isfile("/home/qing/test/qingsword.txt"):withopen("/home/qing/test/qingsword.txt","r")asfile1:line1=file1.readline(2)#获取“青刃”"两个字符print(line1)line1=file1.readline()#得到"\n"回车符,当readline遇到回车符时,指定多少个字符是没有意义的,因为readline遇到回车后会返回returncharacter,不会继续读取print(line1)line1=file1.readline(4)#得到接下来的4个字符"qing"print(line1)#输出,根据前面的解释,很容易理解为什么两者linesofdata之间会有两个空行。除了使用上述方法读取文件内容外,情人清还有另一种读取方式,使用readlines()函数,可以读取文件中的每一行数据,并保存为一个列表。行数据相当于列表的一个元素。可以遍历列表的每个元素输出每一行数据,或者打印出每一行的字符数。请看下面的例子:#!/usr/bin/envpython3#coding=utf-8importosifos.path.isfile("/home/qing/test/qingsword.txt"):withopen("/home/qing/test/qingsword.txt","r")asfile1:lines=file1.readlines()print(lines)forlineinlines:#输出每行的字符数(不包括回车)print(len(line.strip("\n")))#程序输出['Qingblade\n','qingsword\n','www.qingsword.com']2917with不仅可以打开单个文件,还可以一次打开多个文件,如下:#!/usr/bin/envpython3#coding=utf-8importostry:#添加错误处理ifos.path.isfile("hello.py")andos.path.isfile("if.py"):#使用with打开一个或多个文件(逗号可以用来分隔任意数量的文件),好处使用with是的,不需要调用close()函数,with会在block运行后自动调用close()关闭这些文件;read()函数可以一次性读取文件流当前指针位置到文件末尾的所有内容open("hello.py","r")asf1,open("if.py")asf2:print(f1.read())forlineinf2.readlines():#stripwithoutanyparameters()函数可以去除字符串前后的空格、换行和制表符等print(line.strip())#如果在os运行过程中遇到错误,就会被捕获。这个例子没有详细说明可能出现的os错误Sub-processingexceptExceptionaserro:pass如果我们读取的不是文本文件,而是压缩文件、图片、视频文件,那么就需要使用“rb”读取二进制数据流的参数,例如:#!/usr/bin/envpython3#coding=utf-8importostry:ifos.path.isfile("cat.jpeg"):withopen("cat.jpeg","rb")asimg1:#read获取当前目录p中“cat.jpeg”图片文件二进制数据流的前10个字节rint(img1.read(10))exceptExceptionaserro:pass#Programoutputb'\xff\xd8\xff\xe0\x00\x10JFIF'使用参数r读取文本文件,默认为utf读取-8encoding可以,如果需要读取其他编码的文件,需要在open命令中加上字符编码,例如:#!/usr/bin/envpython3#coding=utf-8importostry:ifos.path.isfile("testfile"):#假设测试文件是用gbk编码的。如果在文件读取过程中遇到编码错误,则直接忽略该错误。如果不加errors关键字,open("testfile","r",encoding="GBK",errors="ignore")asf1遇到编码错误时会抛出UnicodeDecodeError异常:print(f1.读取(1))除了异常为错误:passc。文件内容添加到上面的内容中,现在我们进入qingsword。txt,请参见以下示例:#!/usr/bin/envpython3#coding=utf-8importosfile_path="/home/qing/test/qingsword.txt"ifos.path.isfile(file_path):#"a"parameter表示打开文件并添加内容#如果不想在前面的内容后面追加内容,可以写回车,或者用“三引号”换行,用“三引号”注意因为文本的缩进也会被保留,所以本例中输入的是topformatwithopen(file_path,"a")asfile1:file1.write("""欢迎来到我的博客学习:www.qingsword.com""")withopen(file_path,"r")asfile1:print(file1.read())#读取文件的所有内容并输出#程序输出Qingswordqingswordwww.qingsword.com欢迎大家来我这里学习来自博客:www.qingsword.com现在,上面的内容允许我们复制一个文件的内容并将其附加到另一个文件的末尾。下面是一个简单的实现:#!/usr/bin/envpython3#coding=utf-8importos#创建两个文件,分别写入数据file_path_1="/home/qing/test/qingsword_1.txt"file_path_2="/home/qing/test/qingsword_2.txt"withopen(file_path_1,"w")asfile1,\open(file_path_2,"w")asfile2:file1.write("""欢迎来到我的博客学习:www.qingsword.com""")file2.write("青剑")#Filefile_path_2追加file_path_1文件中的内容ifos.path.isfile(file_path_1)and\os.path.isfile(file_path_2):withopen(file_path_2,"r")asfile1,\open(file_path_1,"a")asfile2:file2.write("\n")file2.write(file1.read())#打印出file_path_1文件内容ifos.path.isfile(file_path_1):withopen(file_path_1,"r")asfile1:print(file1.read())#程序输出欢迎来到我的博客:www.qingsword.com情人d.文件读写异常在读写文件时,会出现以下常见异常。如果希望程序更“友好”,我们应该提前了解并使用try语句块来捕获这些异常,下面列出了三种常见的异常,这些异常属于OSError异常类别;FileNotFoundError:当打开一个不存在的文件时触发,文件或路径不存在,或者文件操作过程中找不到文件时触发;PermissionError:尝试在未经许可的情况下读写目录中的文件时触发;IsADirecstoryError:尝试将文件复制到不存在的文件夹时触发;e.获取文件扩展名os.path.splitext()函数可以用来获取文件扩展名,请看下面的例子:#!/usr/bin/envpython#coding=utf-8importosprint(os.path.splitext("qingsword.exe.txt"))print(os.path.splitext("qingsword.exe.txt")[1])#programoutput,os.path.splitext()函数可以拆分最后一个后缀点进来的文件名和前一个文件名成一个元组。通过访问元组中索引位置为1的元素,可以得到文件Extension('qingsword.exe','.txt').txtf。获取文件的绝对路径os.path.abspath()函数可以用来获取文件的绝对路径。这个函数不能判断传入的文件是否存在,即使这个文件不存在,仍然可以使用这个函数。该函数会拼接当前脚本执行的文件名和绝对路径目录:#!/usr/bin/envpython#coding=utf-8importosprint(os.path.abspath("qingsword.txt"))#Programoutput/home/qing/python-lab/qingsword.txt#如果想获取当前脚本所在目录的绝对路径,可以使用如下语法os.path.abspath(".")g。文件大小您可以使用os.path.getsize()函数获取文件大小(以字节为单位):importosprint(os.path.getsize("/home/qing/test/qingsword.txt"))#output,qingsword。txt只有89个字节89h。获取文件的最新修改时间。os.path.getmtime()函数可以得到从1970年到文件最后一次修改的秒数。使用时间模块的ctime()方法,将第二个Number格式化为标准时间输出:"weekmonthdayhour:minute:secondyear"#!/usr/bin/envpython#coding=utf-8importosimporttimefile_path="/home/qing/test/qingsword.txt”打印(time.ctime(os.path.getmtime(file_path)))#ProgramoutputMonAug2917:01:002016i.文件移动、复制和删除Python可以使用shutil模块移动和复制文件,参见下面的例子:#!/usr/bin/envpython#coding=utf-8importosimportshutilifos.path.isfile("qing.txt"):#将当前脚本运行目录下的qing.txt文件复制并重命名为qingsword.txtshutil.copy("qing.txt","qingsword.txt")os.remove("qing.txt")#deletefile#isdir()函数可以判断目标是否为目录ifos.path.isfile("qingsword.txt")andos.path.isdir("pack1"):#将复制的文件剪切并移动到pack1目录并重命名为qingsword.pyshutil.move("qingsword.txt","pack1/qingsword.py")