文件系统操作
By 青衣极客 Blue Geek In 2019-10-24
我们编写的python程序既可能在Windows下运行,也有可能在Linux和Mac OS下运行,一般的操作对于跨平台而言问题都不大,而文件系统的相关操作在不同的平台上是具有较大差异的。我们当然可以使用python中system函数或者popen函数运行终端指令,但是这样就破坏了跨平台的兼容性。如果确认自己的程序只在一种平台上运行,这样处理也是可以接受的,如果自己的程序需要跨平台运行,那么关于文件系统的相关操作最好使用os模块中封装的系列函数完成。本文就讨论一下python中封装的文件系统相关操作,以便使所开发的代码具备跨平台的兼容性。
1. 信息查看
在bash中我们常常运行pwd指令查看当前目录,运行ls指令,查看当前目录下的文件和子目录,也会使用一款工具tree来查看指定目录下的所有子目录和文件。在python中封装了这个三种功能到三个函数中,分别是:os.getcwd(), os.listdir(), os.walk()。其中os.walk()函数返回的是一个迭代对象,迭代对象的每一个元素为一个三元元组,第一个位置保存目录,第二个位置保存子目录列表,第三个位置保存文件列表。该函数递归获取指定目录下的所有子目录和文件路径。
import os
print(os.getcwd()) # 查看当前目录
print(os.listdir('..')) # 查看上一级目录的文件和文件夹
dir_file = os.walk('./code/') # 递归获取指定目录下的所有路径
for i in dir_file:
print(i)
2. 修改目录和文件
在shell中,常常使用cd指令改变当前的工作目录,python封装了os.chdir()函数来实现这个功能。
os.chdir('..')
!tree -d
os.chdir('./python/')
[01;34m.[00m
├── [01;34mcpp[00m
├── [01;34mpython[00m
│ └── [01;34mcode[00m
│ ├── [01;34m__pycache__[00m
│ ├── [01;34mdjangotest[00m
│ │ ├── [01;34m__pycache__[00m
│ │ └── [01;34mmigrations[00m
│ │ └── [01;34m__pycache__[00m
│ └── [01;34mmigrations[00m
├── [01;34mubuntu[00m
└── [01;34mweb[00m
11 directories
使用过Windows和Linux的朋友应该知道,这两个操作系统中文件路径的分隔符是不一样的,这在操作文件系统时是一件令人烦躁的地方,所幸python封装了一个函数来解决这个问题。使用os.path.join()函数来连接路径的各个部分,则可以得到一个操作系统对应的合法路径。
print(os.path.join('hello', 'world'))
hello/world
在终端中,我们常常用mkdir -p指令来创建目录,在python中就可以使用os.makedirs()函数来创建目录。
import shutil
if os.path.isdir('./testdir'):
shutil.rmtree('./testdir')
os.makedirs('./testdir')
!tree -d testdir
[01;34mtestdir[00m
0 directories
在终端中,我们使用cp指令来拷贝文件或目录,在python中可以使用shutil.copy2函数来拷贝。
shutil.copy2('./code/__init__.py', './testdir')
!tree testdir/
[01;34mtestdir/[00m
└── __init__.py
0 directories, 1 file
在shell中,我们使用mv指令来移动文件或目录,或者修改文件名,在python中可以使用shutil.move来实现。
shutil.move('./testdir/__init__.py' , './testdir/move.py')
!tree testdir/
[01;34mtestdir/[00m
└── move.py
0 directories, 1 file
python中提供了os.remove函数来完成shell中的rm指令对应的删除文件的功能。
os.remove('./testdir/move.py')
!tree testdir/
[01;34mtestdir/[00m
0 directories, 0 files
如果需要删除目录,在终端中,我们会使用rm -r指令完成,在python中可以使用shutil.rmtree实现这种需求。
shutil.rmtree('./testdir')
!tree testdir/
testdir/ [error opening dir]
0 directories, 0 files
3. 文件读写
除上述的文件系统操作外,还有一类文件操作,即文件读写。python使用open函数打开文件获得一个迭代对象,然后通过对这个迭代对象进行遍历来读取文件内容。通过向open函数传参来控制读方式打开还是写方式打开。
!printf "1 2 3 4 5">./test_file.txt
with open('./test_file.txt', 'r') as fid:
for line in fid:
print('从文件中读取:{}'.format(line))
with open('./test_file.txt', 'w') as fid:
fid.write('hello world\r\n')
!cat ./test_file.txt
!rm ./test_file.txt
从文件中读取:1 2 3 4 5
到此,对python中文件系统相关的操作讨论完毕。本文在写作之前,参考英文网页链接如下:https://towardsdatascience.com/10-python-file-system-methods-you-should-know-799f90ef13c2 。

COMMENT
博客评论区功能由Github Issue提供,提交Issue时请以本文标题为话题。
"BG38-文件系统操作"