文件系统操作

BG38

Posted by Blue Geek on October 24, 2019

文件系统操作

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/')
.
├── cpp
├── python
│   └── code
│       ├── __pycache__
│       ├── djangotest
│       │   ├── __pycache__
│       │   └── migrations
│       │       └── __pycache__
│       └── migrations
├── ubuntu
└── web

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
testdir

0 directories

在终端中,我们使用cp指令来拷贝文件或目录,在python中可以使用shutil.copy2函数来拷贝。

shutil.copy2('./code/__init__.py', './testdir')
!tree testdir/
testdir/
└── __init__.py

0 directories, 1 file

在shell中,我们使用mv指令来移动文件或目录,或者修改文件名,在python中可以使用shutil.move来实现。

shutil.move('./testdir/__init__.py' , './testdir/move.py')
!tree testdir/
testdir/
└── move.py

0 directories, 1 file

python中提供了os.remove函数来完成shell中的rm指令对应的删除文件的功能。

os.remove('./testdir/move.py')
!tree testdir/
testdir/

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-文件系统操作"