Python开发(人工智能/大数据/机器学习)

34.Python:操作文件和目录

2018-07-15  本文已影响24人  TensorFlow开发者

前言

我们已经掌握了Python中文件的读写操作,如果要把文件指定写到某个目录下,又该如何操作呢?Python内置的os模块也可以直接调用操作系统提供的接口函数。本节内容需要导入os模块:import os

操作系统

查看操作系统可以用以下代码:

import os
print("系统类型:" + os.name)

运行结果:

系统类型:nt

解释说明:如果结果是posix,说明系统是Linux、Unix或Mac OS X;如果是nt,就是Windows系统。我用的是Windows系统,所以打印出来的是nt

环境变量

在操作系统中定义的环境变量,全部保存在os.environ这个变量中,可以直接查看:

import os
from urllib.request import urlopen
# print("系统类型:" + os.name)
print("环境变量:{}".format(os.environ))

运行结果:

环境变量:environ({'SYSTEMROOT': 'C:\\WINDOWS', 'PROCESSOR_REVISION': '8e09', 'CONFIGSETROOT': 'C:\\WINDOWS\\ConfigSetRoot', 'PROCESSOR_LEVEL': '6', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules', 'PUBLIC': 'C:\\Users\\Public', 'TMP': 'C:\\Users\\ChocoLee\\AppData\\Local\\Temp', 'SYSTEMDRIVE': 'C:', 'LOGONSERVER': '\\\\LENOVO-LAPTOP', 'LOCALAPPDATA': 'C:\\Users\\ChocoLee\\AppData\\Local', 'TEMP': 'C:\\Users\\ChocoLee\\AppData\\Local\\Temp', 'HOMEDRIVE': 'C:', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe', 'PYTHONIOENCODING': 'UTF-8', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'LENOVO-LAPTOP', 'USERDOMAIN': 'LENOVO-LAPTOP', 'USERPROFILE': 'C:\\Users\\ChocoLee', 'CLASSPATH': ' .;D:\\my_android_tools\\Java\\jdk1.8.0_121\\bin\\lib;', 'PROGRAMFILES': 'C:\\Program Files', 'APPDATA': 'C:\\Users\\ChocoLee\\AppData\\Roaming', 'PYCHARM_HOSTED': '1', 'SESSIONNAME': 'Console', 'ALLUSERSPROFILE': 'C:\\ProgramData', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'PROGRAMDATA': 'C:\\ProgramData', 'NUMBER_OF_PROCESSORS': '4', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PATH': 'F:\\Program Files\\Anaconda3\\Library\\bin;C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel\\iCLS Client\\;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;D:\\my_android_tools\\Java\\jdk1.8.0_121\\bin\\tools;D:\\my_android_tools\\Java\\jdk1.8.0_121\\bin;D:\\my_android_tools\\sdk\\platform-tools;F:\\Git\\Git\\bin;;F:\\Program Files\\Anaconda3;F:\\Program Files\\Anaconda3\\Scripts;F:\\Program Files\\Anaconda3\\Library\\bin;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Users\\ChocoLee\\AppData\\Local\\Microsoft\\WindowsApps;', 'JAVA_HOME': 'D:\\my_android_tools\\Java\\jdk1.8.0_121\\bin', 'PROGRAMW6432': 'C:\\Program Files', 'HOMEPATH': '\\Users\\ChocoLee', 'MOZ_PLUGIN_PATH': 'F:\\FoxitReader\\Foxit Reader\\plugins\\', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 142 Stepping 9, GenuineIntel', 'WINDIR': 'C:\\WINDOWS', 'USERNAME': 'ChocoLee', 'OS': 'Windows_NT', 'ONEDRIVE': 'C:\\Users\\ChocoLee\\OneDrive', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'PYTHONUNBUFFERED': '1', 'PYTHONPATH': 'F:\\python_projects', 'USERDOMAIN_ROAMINGPROFILE': 'LENOVO-LAPTOP'})

要获取某个环境变量的值,可以调用os.environ.get('key'),比如上面的环境变量中,获取第一个key为"SYSTEMROOT"的对应的值:

# 获取环境变量的值
print(os.environ.get("SYSTEMROOT"))

运行结果:

C:\WINDOWS

操作文件和目录

操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中,这一点要注意一下。查看、创建和删除目录可以这么调用:

# 查看当前路径的绝对路径
print(os.path.abspath(""))

运行结果:

F:\python_projects\io_file

在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:

# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来
path_dir = os.path.join(r"F:\python_projects\io_file", "new_dir")
print(path_dir)

# 在F:\python_projects\io_file\目录下新创建一个文件夹new_dir
os.mkdir(path_dir)

运行结果:

F:\python_projects\io_file\new_dir
新创建一个文件夹new_dir

注意:把两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。在Linux/Unix/Mac下,os.path.join()返回这样的路径分隔符:/,而在Windows系统下,返回:\

os.rmdir(r'F:\python_projects\io_file\new_dir')

运行结果:


删除了文件夹new_dir

同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名:

# 拆分目录
print(os.path.split(r"F:\python_projects\io_file\new_dir"))

# 直接获取目录或文件名
fileName = os.path.split(r"F:\python_projects\io_file\new_dir"))[1]
print(fileName)

运行结果:

('F:\\python_projects\\io_file', 'new_dir')

new_dir
# 获取文件扩展名
print(os.path.splitext(r"F:\python_projects\io_file\io_test.txt"))

运行结果:

('F:\\python_projects\\io_file\\io_test', '.txt')

说明:这些合并、拆分路径的函数并不要求目录和文件要真实存在,它们只对字符串进行操作。

文件操作

# 文件重命名
# os.rename("aaa.txt", "bbb.txt")
# 删除文件
os.remove("bbb.txt")

但是复制文件的函数居然在os模块中不存在!原因是复制文件并非由操作系统提供的系统调用。理论上讲,我们通过上一节的读写文件可以完成文件复制,只不过要多写很多代码。

幸运的是shutil模块提供了copyfile()的函数,你还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充。

过滤文件

我们可以打印出当前目录下所有文件或者添加条件后,就变成了筛选。

当前目录结构
# 过滤文件

# 打印当前目录下所有文件
print("当前目录下所有文件:{}".format([x for x in os.listdir(os.path.abspath(""))]))

# 筛选出.py文件
print("筛选出.py文件:{}".format([x for x in os.listdir(os.path.abspath("")) if os.path.isfile(x) and x.__contains__(".py")]))

运行结果:

当前目录下所有文件:['2.jpg', 'bbb.txt', 'file_write.txt', 'file_write_bit.txt', 'file_write_json.txt', 'file_write_tuple.txt', 'io_string_bytes.py', 'io_test.txt', 'my_file.py', 'path_env.py', 'print_repr.py', '__init__.py', '__pycache__']

筛选出.py文件:['io_string_bytes.py', 'my_file.py', 'path_env.py', 'print_repr.py', '__init__.py']

小结

本小节主要学习了Python内置的os模块,可以直接调用操作系统提供的接口函数,进而操作文件和目录。


更多了解,可关注微信公众号:人人懂编程


微信公众号:人人懂编程
上一篇 下一篇

猜你喜欢

热点阅读