Python进阶教程m4–目录、文件操作

原文链接:http://www.juzicode.com/archives/719

1 列出当前目录下的所有文件或者文件夹 os.listdir()

import os 
print('os.listdir():',os.listdir())

==========结果:
os.listdir(): ['a.txt', 'b.txt', 'os-test.py', 'txt']

2 判断是文件或是目录:os.path.isdir(path),os.path.isfile(path)

path是要判断的文件或者目录,如果是当前目录,直接使用文件或者文件夹名称,也可以是包含相对路径或绝对路径的文件或者文件夹


import os 
files = os.listdir()
print('files=',files)
for f in files:
    print('f:',f)
    if os.path.isdir(f):
        print('%s is dir'%f)
    if os.path.isfile(f):
        print('%s is file'%f)

==========结果:
目录结构是这样的,其中txt是目录,其他的是文件:
2020/07/01  22:40    <DIR>          .
2020/07/01  22:40    <DIR>          ..
2020/07/01  22:40                 0 a.txt
2020/07/01  22:40                 0 b.txt
2020/07/01  22:45               566 os-test.py
2020/07/01  22:40    <DIR>          txt

运行结果的:
files= ['a.txt', 'b.txt', 'os-test.py', 'txt']
f: a.txt
a.txt is file
f: b.txt
b.txt is file
f: os-test.py
os-test.py is file
f: txt
txt is dir

3 环境变量

3.1 获取PATH环境变量 os.getenv(‘PATH’)

import os 
print('os.getenv():',os.getenv('PATH')

==========结果:
os.getenv(PATH): C:\Program Files\python38;......

3.2 设置PATH环境变量 os.putenv(‘PATH’,XYZ)

putenv()可以用来设置PATH环境变量的值,设置后会影响os.system(), popen() or fork() and execv()等函数,改变这些函数的环境变量值,也可以用在加载dll文件前,指定dll查找路径。

import os 
path = os.getenv('PATH')
os.putenv('PATH',path+';this\\is\\new\\path')

4 判断文件或目录是否存在 os.path.exists(path)

path是要判断的文件或者目录,如果是当前目录,直接使用文件或者文件夹名称,也可以是包含相对路径或绝对路径的文件或者文件夹

print('os.listdir():',os.listdir())
path = 'hello.py'
print('hello.py exists():',os.path.exists(path))
path = 'txt'
print('txt exists()::',os.path.exists(path))

==========结果:
目录结构是这样的,其中txt是目录,其他的是文件:
2020/07/01  22:40    <DIR>          .
2020/07/01  22:40    <DIR>          ..
2020/07/01  22:40                 0 a.txt
2020/07/01  22:40                 0 b.txt
2020/07/01  22:45               566 os-test.py
2020/07/01  22:40    <DIR>          txt

os.listdir(): ['a.txt', 'b.txt', 'os-test.py', 'txt']
hello.py exists(): False
txt exists(): True

5 获取文件的路径

5.1 获取当前工作目录os.getcwd()

import os 
print('os.getcwd():',os.getcwd())#获取当前工作目录
 
==========结果:
os.getcwd(): E:\juzicode\py3study\m04

5.2 __file__变量、os.path.realpath(__file__)

Python中可以利用__file__变量获取到该py文件的完整路径,比如在E:\juzicode\py3study\m04\os-test.py文件中的 __file__变量就是保存了“ E:\juzicode\py3study\m04\os-test.py ”的一个字符串变量:

print('__file__:',__file__)
print('type(__file__):',type(__file__))
print('realpath(__file__):',os.path.realpath(__file__))

__file__: E:\juzicode\py3study\m04\os-test.py
type(__file__): <class 'str'>
realpath(__file__): E:\juzicode\py3study\m04\os-test.py

5.3 获取文件夹路径 os.path.dirname(realpath)

realpath=os.path.realpath(__file__)
print('当前文件绝对路径:',realpath)
dirname = os.path.dirname(realpath)
print('目录名称:',dirname)

============结果:
当前文件绝对路径: E:\juzicode\py3study\m04\os-test.py
目录名称: E:\juzicode\py3study\m04

通过dirname()函数可以一直向上迭代找到当前所在的系统盘符,比如上面这个例子中的E:\:

realpath=os.path.realpath(__file__)
print('当前文件绝对路径:',realpath)
dirname = os.path.dirname(realpath)
print('目录名称:',dirname)
garder = os.path.dirname(dirname)
print("父目录:" + garder)
garder = os.path.dirname(garder)
print("父目录:" + garder)
garder = os.path.dirname(garder)
print("父目录:" + garder)
garder = os.path.dirname(garder)
print("父目录:" + garder) 

===========结果:
当前文件绝对路径: E:\juzicode\py3study\m04\os-test.py
目录名称: E:\juzicode\py3study\m04
父目录:E:\juzicode\py3study
父目录:E:\juzicode
父目录:E:\
父目录:E:\  #找到最后一层的盘符后,不再变化

6 获取文件名称 os.path.basename(realpath)

获取到排除路径信息的文件名称,

realpath=os.path.realpath(__file__)
print('realpath(__file__):',os.path.realpath(__file__))
print('basename(realpath):',os.path.basename(realpath))

==========结果:
realpath(__file__): E:\juzicode\py3study\m04\os-test.py
basename(realpath): os-test.py

注意如果一个路径中最后是路径分隔符,basename()返回的会是一个空字符串:

print('basename():',os.path.basename('e:\\juzicode\\py3study'))
print('basename():',os.path.basename('e:\\juzicode\\py3study\\'))

==========结果:
basename(): py3study
basename():

7 splitXXX()类函数 切割函数

__file__: E:\juzicode\py3study\m04\os-test.py
split(): ('E:\\juzicode\\py3study\\m04', 'os-test.py')   #切割路径和文件名
splitext(): ('E:\\juzicode\\py3study\\m04\\os-test', '.py') #切割后缀和其他
splitdrive(): ('E:', '\\juzicode\\py3study\\m04\\os-test.py') #切割盘符和其他

==========结果:
__file__: E:\juzicode\py3study\m04\os-test.py
split(): ('E:\\juzicode\\py3study\\m04', 'os-test.py')
splitext(): ('E:\\juzicode\\py3study\\m04\\os-test', '.py')
splitdrive(): ('E:', '\\juzicode\\py3study\\m04\\os-test.py')

8 获取文件属性

os.path.getatime(): 获取访问文件 ,时间戳格式

os.path.getmtime():获取修改时间,时间戳格式

os.path.getctime():获取创建时间,时间戳格式

os.path.getsize(): 获取文件大小,字节为单位

print('__file__:',__file__)
print('getatime():',os.path.getatime(__file__))
print('getmtime():',os.path.getmtime(__file__))
print('getctime():',os.path.getctime(__file__))
print('getsize():',os.path.getsize(__file__))

==========结果:
__file__: E:\juzicode\py3study\m04\os-test.py
getatime(): 1593970493.9610956
getmtime(): 1593970491.1732953
getctime(): 1593624515.381883
getsize(): 2164

9 重命名文件 os.rename(path1,path2)

path1是要复制的文件路径;path2是目标文件路径

print('重命名文件')
ret = os.rename('test.txt','juzicode.txt')
print('rename():',ret)

==========结果:
重命名文件
rename(): None

如果文件不存在,复制文件时会抛异常,提示文件不存在:

File “E:\juzicode\py3study\m04-os\os-test.py”, line 91, in
ret = os.rename(‘test.txt’,’juzicode.txt’)
FileNotFoundError: [WinError 2] 系统找不到指定的文件。: ‘test.txt’ -> ‘juzicode.txt

10 删除文件 os.remove(path)

path是要删除的文件路径

print('删除文件')
ret = os.remove('juzicode.txt')
print('remove():',ret)

==========结果:
删除文件
remove(): None

11 shutil模块

复制文件shutil.copyfile(src,dest)

在os模块中没有复制文件的函数,复制文件可以调用shutil模块的copyfile()函数,该函数调用成功后返回目标文件的路径:

import shutil
ret = shutil.copyfile('test.txt','juzicode.txt')
print('ret:',ret)

==========结果:
ret: juzicode.txt

12 创建目录

os.mkdir()创建单层目录,必须保证最后一层目录之前的路径是存在的。os.makedirs()则可以用来创建多层目录。

print('创建多层目录')
ret = os.makedirs('a1\\b\\c\\d\\e')
print('makedirs():',ret)

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注