当前位置: 首页 > 后端技术 > Python

闻起来真香!Python中十大常用的文件操作

时间:2023-03-25 21:10:28 Python

董格飞在日常生活中对批处理文件的需求非常多。用Python写脚本可以轻松实现,但是过程中难免要和文件打交道,而且第一次会遇到很多文件的操作是没有办法开始的,只能找度娘了。在这篇文章中,东哥整理出了Python中最常用的10个文件操作,无论是批处理还是读取文件,相信这样的梳理都会有所帮助。1.显示当前目录当我们想知道当前工作目录是什么的时候,我们可以简单的使用os模块的getcwd()函数,或者使用pathlib的cwd()函数,如下所示。>>>#第一种方法:显示当前目录...importos...print("Currentworkingdirectory:",os.getcwd())...CurrentWorkDirectory:/Users/ycui1/PycharmProjects/Medium_Python_Tutorials>>>#第二种方法:或者我们也可以使用pathlib...frompathlibimportPath...print("Currentworkingdirectory:",Path.cwd())...CurrentWorkDirectory:/Users/ycui1/PycharmProjects/Medium_Python_Tutorials如果您使用的是旧版本的Python(<3.4),则必须使用os模块。2.创建一个新目录要创建一个目录,使用os模块的mkdir()函数。此函数将在指定路径下创建一个目录。如果只使用目录名,则会在当前目录下创建一个文件夹,这是绝对路径和相对路径的概念。>>>#在当前文件夹下新建一个目录...os.mkdir("test_folder")...print("目录是否存在:",os.path.exists("test_folder"))...DoesthedirectoryExists:True>>>#在特定文件夹中创建一个新目录...os.mkdir('/Users/ycui1/PycharmProjects/tmp_folder')...print("Doesthedirectoryexist:",os.path.exists('/Users/ycui1/PycharmProjects/tmp_folder'))...目录是否存在:True但是,如果要创建多级目录,比如文件夹下的文件夹),则需要使用makedirs()函数。>>>#创建一个包含子目录的目录...os.makedirs('tmp_level0/tmp_level1')...print("Doesthedirectoryexist:",os.path.exists("tmp_level0/tmp_level1"))...Isthedirectorythere:True如果使用最新版本的Python(≥3.4),您可以考虑利用pathlib模块创建新目录。它不仅创建子目录,而且还处理路径中任何丢失的目录。#UsingpathlibfrompathlibimportPathPath("test_folder").mkdir(parents=True,exist_ok=True)需要注意一个问题,如果多次尝试运行上面的某些代码,可能会遇到问题"cannot创建一个已经存在的新目录”。我们可以通过将exist_ok参数设置为True来处理这个问题(默认值False将阻止我们创建目录)。>>>#Usepathlib...frompathlibimportPath...Path("test_folder").mkdir(parents=True,exist_ok=False)...Traceback(最近调用最后):文件“”,第3行,在文件“/Users/ycui1/.conda/envs/Medium/lib/python3.8/pathlib.py”,第1284行,在mkdirself._accessor.mkdir(self,mode)FileExistsError:[Errno17]Fileexists:'test_folder'3.删除目录和文件在我们处理完一些文件或文件夹后,我们可能希望将其删除。为此,我们可以使用os模块中的remove()函数来删除文件。如果我们想删除一个文件夹,我们应该使用rmdir()来代替。>>>#删除一个文件...print(f"*{os.path.isfile('tmp.txt')}")...os.remove('tmp.txt')...print(f"*删除文件后{os.path.exists('tmp.txt')}")...*删除文件前为真*删除文件后为假>>>#删除一个文件夹...print(f"*在删除文件夹{os.path.isdir('tmp_folder')}")...os.rmdir('tmp_folder')...print(f"*在删除文件夹{os.path.exists('tmp_folder')}")...*删除文件夹前为true*删除文件夹后为false如果使用pathlib模块,可以使用unlink()方法,使用rmdir()方法删除目录。请注意,这两个方法都是Path对象的实例方法。4.获取文件列表当我们分析一个作业或者机器学习项目进行数据处理时,我们需要获取特定目录下的文件列表。通常,文件名具有匹配模式。假设我们要查找目录下的所有.txt文件,可以使用Path对象的glob()方法来实现。glob()方法创建了一个允许我们迭代的生成器。>>>txt_files=list(Path('.').glob("*.txt"))...print("Txt文件:",txt_files)...Txt文件:[PosixPath('hello_world.txt'),PosixPath('hello.txt')]或者,直接使用glob模块更方便,如下所示,它通过创建可以使用的文件名列表来实现类似的功能。大多数情况下,比如文件读写,两者都可以使用。>>>fromglobimportglob...files=list(glob('h*'))...print("Filesstartingwithh:",files)...Filesstartingwithh:['hello_world.txt','hello.txt']5.移动和复制文件移动文件常见的文件管理任务之一是移动和复制文件。在Python中,这些任务可以很容易地完成。要移动文件,只需通过将其旧目录替换为目标目录来重命名文件即可。假设我们需要将所有.txt文件移动到另一个文件夹,下面使用Path。>>>target_folder=Path("目标文件")...target_folder.mkdir(parents=True,exist_ok=True)...source_folder=Path('.')......txt_files=source_folder.glob('*.txt')...fortxt_fileintxt_files:...filename=txt_file.name...target_path=target_folder.joinpath(filename)...print(f"**movefile{filename}")...print("目标文件存在:",target_path.exists())...txt_file.rename(target_path)...print("目标文件存在:",target_path.exists(),'\n')...**移动文件hello_world.txt目标文件存在:False目标文件存在:True**移动文件hello.txt目标文件存在:False目标文件存在:True复制文件我们可以利用_shutil_模块中可用的功能,_shutil_模块是标准库中用于文件操作的另一个有用模块。我们可以通过将源文件和目标文件指定为字符串来在模块中使用copy()函数。一个简单的例子如下所示。当然,您可以将copy()函数与glob()函数结合使用,以处理一堆具有相同模式的文件。>>>importshutil......source_file="target_folder/hello.txt"...target_file="hello2.txt"...target_file_path=Path(target_file)...print("*复制前的文件存在:",target_file_path.exists())...shutil.copy(source_file,target_file)...print("*复制后,文件存在:",target_file_path.exists())...*复制前,fileExists:False*复制后文件存在:True6.检查目录/文件上面的示例一直在使用exists()方法来检查特定路径是否存在。如果存在则返回True;如果不存在则为假。此功能在os和pathlib模块中均可用,每个模块的用法如下。#os模块中exists()的用法os.path.exists('path_to_check')#pathlib模块中exists()的用法Path('directory_path').exists()使用pathlib,我们也可以检查是否路径是目录或文件。#检查路径是否为目录os.path.isdir('pathtocheck')Path('pathtocheck').is_dir()#检查路径是否为文件os.path.isfile('pathtocheck'')Path('pathtocheck').is_file()7.获取文件信息文件名在处理文件的时候,很多时候需要提取文件名。Path的使用很简单,看Path对象的name属性path.name即可。如果你不想要后缀,你可以检查词干属性path.stem。对于Path().glob('c*.py')中的py_file:...print('Namewithextension:',py_file.name)...print('Nameonly:',py_file.stem)...含文件后缀:closures.py仅文件名:closures含文件后缀:counter.py仅文件名:counter含文件后缀:context_management.py仅文件名:context_management文件后缀如果想单独提取文件后缀,可以检查Path对象的后缀属性。>>>file_path=Path('closures.py')...print("Fileextension:",file_path.suffix)...FileExtension:.pyfileMoreinformation如果您想获得有关该文件的更多信息,比如文件大小和修改时间,可以使用stat()方法,和os.stat()一样。>>>#路径路径对象...current_file_path=Path('iterable_usages.py')...file_stat=current_file_path.stat()...>>>#获取文件大小:...print("文件大小(Bytes):",file_stat.st_size)Filesize(Bytes):3531>>>#获取最近访问时间...print("Lastaccesstime:",file_stat.st_atime)最近访问时间:1595435202.310935>>>#GetLastmodifiedtime...print("Lastmodifiedtime:",file_stat.st_mtime)Lastmodifiedtime:1594127561.32044178.读取文件最重要的文件操作之一是从文件中读取数据。读取文件的最常见方法是使用内置的open()函数创建一个文件对象。默认情况下,该函数将以读取模式打开文件并将文件中的数据视为文本。>>>#读取所有文本...withopen("hello2.txt",'r')asfile:...print(file.read())...HelloWorld!HelloPython!>>>#逐行读取...withopen("hello2.txt",'r')asfile:...fori,lineinenumerate(file,1):...print(f"*readfetchline#{i}:{line}")...*阅读第1行:HelloWorld!*阅读第2行:你好Python!如果文件中的数据不多,可以使用read()方法一次读取所有内容。但是如果文件很大,你应该考虑使用生成器,它可以逐行处理数据。默认情况下将文件内容视为文本。如果要使用二进制文件,则应明确指定是使用r还是rb。另一个棘手的问题是文件的编码。一般情况下,open()使用utf-8编码,如果要使用其他编码处理文件,需要设置encoding参数。9.写文件,还是用open()函数,把mode改成w或者a打开文件创建文件对象。w模式下,旧数据会被覆盖,新数据会被写入。在一种模式下,可以在原有数据的基础上增加新的数据。>>>#将新数据写入文件...withopen("hello3.txt",'w')asfile:...text_to_write="HelloFilesFromWriting"...file.write(text_to_write)...>>>#添加一些数据...withopen("hello3.txt",'a')asfile:...text_to_write="\nHelloFilesFromAppending"...file.write(text_to_write)...>>>#检查文件数据是否正确...withopen("hello3.txt")asfile:...print(file.read())...HelloFilesFromWritingHelloFilesFromAppendingEach以上每次打开文件时都使用with语句。with语句为我们创建一个上下文来处理文件,当我们处理完文件时它可以关闭文件对象。这一点很重要,如果我们不及时关闭打开的文件对象,它很有可能被破坏。10.压缩和解压文件zipfile模块提供了压缩文件的功能。一个zip文件对象是使用ZipFile()函数创建的,类似于我们对open()函数所做的,两者都涉及创建一个由上下文管理器管理的文件对象。>>>fromzipfileimportZipFile......#创建一个压缩文件...withZipFile('text_files.zip','w')asfile:...fortxt_fileinPath().glob('*.txt'):...print(f"*Addfile:{txt_file.name}tozipfile")...file.write(txt_file)...*Addfile:hello3.txttozipfile*添加文件:hello2.txt到压缩文件解压文件>>>#解压文件...withZipFile('text_files.zip')aszip_file:...zip_file.printdir()...zip_file.extractall()...文件名修改sizehello3.txt2020-07-3020:29:5051hello2.txt2020-07-3018:29:5226结论以上是Python中常见的文件操作整理出来的,都是使用built-实现的在函数中。当然你也可以使用pandas等库来完成一些操作。原创不易,我觉得挺好的,也喜欢。欢迎关注我的个人公众号:PythonDataScience数据科学学习网站:datadeepin

猜你喜欢