欢迎来到“只读课堂”!
os模块主要有以下几种:posix(适用于unix操作系统) nt(win) mac(旧版本的MACOS),dos(DOS)
使用os模块的过程中,不需要考虑平台差异,python解释器就会帮大家选择正确的系统支持
window系统下是nt
In [1]:
#但是你不需要考虑,你到底要选择哪个操作系统和代码,python会帮你选好你需要的操作环境,你只需要打代码就行了。os对进程和进程运行环境进行管理,os模块还可以处理大部分文件系统操作:比如说,删除、重命名文件、遍历目录树,以及管理文件访问权限。
In [2]:
#之前是打开文件操作,但是现在os模块是在文件外进行操作。os和sys的区别:
os负责程序与操作系统的交互,sys负责程序与python解释器的交互
os.path和sys.path:
sys.path是咱们常用的PATH环境变量,而os.path是一个模块,提供一些方法函数
os.name:输入正在使用的平台
os.getcwd():函数得到当前工作目录,即当前Python脚本工作的目录路径
运行目录:执行程序的路径
工作目录:程序运行时,程序中我们要操作的一系列相对路径(需要参照),以运行时目录为参照。并且可在程序运行时更改
os.listdir():返回指定目录下的所有文件和目录名的一个列表,但是并没有列出来什么是目录,什么是文件
os.remove('flie_name'):删除指定文件
os.rmdir('dir_name'):删除指定目录
先导入os模块
In [4]:
import osIn [5]:
os.nameOut[5]:
'nt'In [6]:
#它会返回一些字母,也就是我们前面提到的操作系统的代号。工作路径
In [9]:
os.getcwd()Out[9]:
'C:\\Users\\Jimmy'运行目录
In [11]:
#工作路径是可以改变的In [16]:
#如果这里不给出目录的话,它会默认使用工作目录,也就会返回当前工作目录里的所有文件。In [17]:
#如果我们想要实现一个小功能In [21]:
#假如说我们要显示某个目录下的所有目录下的所有文件和所有文件夹os.listdir()
In [22]:
os.listdir()Out[22]:
['.ipynb_checkpoints', '.ipython', '.jupyter', '.pylint.d', '.vscode', '3D Objects', 'AppCan settings', 'AppData', 'Application Data', 'Contacts', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'Favorites', 'Intel', 'Links', 'Local Settings', 'MicrosoftEdgeBackups', 'Music', 'My Documents', 'NetHood', 'NTUSER.DAT', 'ntuser.dat.LOG1', 'ntuser.dat.LOG2', 'NTUSER.DAT{47a6a17a-a514-11e7-a94e-ec0d9a05c860}.TM.blf', 'NTUSER.DAT{47a6a17a-a514-11e7-a94e-ec0d9a05c860}.TMContainer00000000000000000001.regtrans-ms', 'NTUSER.DAT{47a6a17a-a514-11e7-a94e-ec0d9a05c860}.TMContainer00000000000000000002.regtrans-ms', 'ntuser.ini', 'OneDrive', 'Pictures', 'PrintHood', 'Python入门第24课——递归(只读课堂).ipynb', 'Python初级第2课——os模块(只读课堂).ipynb', 'Recent', 'Saved Games', 'Searches', 'SendTo', 'Templates', 'Untitled.ipynb', 'Videos', '「开始」菜单']In [23]:
#我们可以随便给它来一个参数In [24]:
#比如说桌面In [27]:
os.listdir('C:\\Users\\Jimmy\\Desktop')Out[27]:
['Acrobat Pro9.lnk', 'Anaconda Navigator.lnk', 'desktop.ini', 'E听说.lnk', 'Google Chrome.lnk', "Jeason's Files.lnk", 'Jupyter Notebook.lnk', 'QQ影音.lnk', 'Visual Studio Code.lnk', '迅雷.lnk', '金山词霸2016.lnk']In [29]:
#注意啊,一定要用双斜杠或者在前面加一个r,从而防止特定字母。In [30]:
#但是这个功能只能反映桌面下的浅浅的一个目录,文件夹之类的都没展开,所以说这个功能还是比较low的。删除指定文件
In [35]:
#先新建一个文件In [36]:
os.listdir('C:\\Users\\Jimmy\\Desktop')Out[36]:
['Acrobat Pro9.lnk', 'Anaconda Navigator.lnk', 'desktop.ini', 'E听说.lnk', 'Google Chrome.lnk', "Jeason's Files.lnk", 'Jupyter Notebook.lnk', 'QQ影音.lnk', 'Visual Studio Code.lnk', '新建文件夹', '迅雷.lnk', '金山词霸2016.lnk']In [37]:
#这里多了一个文件夹,可以拿来删除了In [38]:
os.rmdir('新建文件夹') --------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) <ipython-input-38-814e3d4efbb6> in <module>() ----> 1 os.rmdir('新建文件夹') FileNotFoundError: [WinError 2] 系统找不到指定的文件。: '新建文件夹'In [39]:
#这样系统又会默认到工作目录下面去,所以报错说没有这个目录,In [40]:
#这样说来我们就要把目录给全,并且转义。In [41]:
os.rmdir(r'C:\Users\Jimmy\Desktop\新建文件夹')In [42]:
#这样就能删除了In [43]:
#再看看确保删除:In [45]:
os.listdir('C:\\Users\\Jimmy\\Desktop')Out[45]:
['Acrobat Pro9.lnk', 'Anaconda Navigator.lnk', 'desktop.ini', 'E听说.lnk', 'Google Chrome.lnk', "Jeason's Files.lnk", 'Jupyter Notebook.lnk', 'QQ影音.lnk', 'Visual Studio Code.lnk', '迅雷.lnk', '金山词霸2016.lnk']In [46]:
#是不是没有了啊对应关系
In [48]:
#如果我们不想用绝对路径,而就想要删除那个文件夹,那怎么办?(绝对路径In [50]:
os.rmdir(r'.\Desktop\新建文件夹')In [51]:
#是不是只用这样简写就行了?只是说要记得在\Desktop前面加个“.”In [52]:
os.listdir('C:\\Users\\Jimmy\\Desktop')Out[52]:
['Acrobat Pro9.lnk', 'Anaconda Navigator.lnk', 'desktop.ini', 'E听说.lnk', 'Google Chrome.lnk', "Jeason's Files.lnk", 'Jupyter Notebook.lnk', 'QQ影音.lnk', 'Visual Studio Code.lnk', '迅雷.lnk', '金山词霸2016.lnk']In [53]:
#就没有了os.mkdor('dir_name'):创建目录
os.makedirs('a/b/c'):递归创建目录
os.system('ls'):执行shell命令
os.chdir('file_path'):改变工作目录
os.chmod('file_name'):改变文件或目录的权限
In [54]:
dir(os)Out[54]:
['DirEntry', 'F_OK', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'PathLike', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list', '_putenv', '_unsetenv', '_wrap_close', 'abc', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_exec_path', 'get_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getenv', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'pathsep', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sep', 'set_handle_inheritable', 'set_inheritable', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st', 'startfile', 'stat', 'stat_float_times', 'stat_result', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sys', 'system', 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'urandom', 'utime', 'waitpid', 'walk', 'write']In [55]:
#这个代码可以把当前模块里所有的代码显示出来,一个都逃不掉,也可以避免遗忘。创建目录
In [58]:
#创建目录就不用讲了,你懂的递归创建目录
In [56]:
os.makedirs(r'C:\Users\Jimmy\Desktop\a\b\c')In [57]:
#此时在我的桌面上已经创建成功了
In [59]:
#如果不信,我们可以用一个代码来查看:In [61]:
import datetime datetime.datetime.now()Out[61]:
datetime.datetime(2018, 4, 1, 15, 37, 0, 252814)
In [62]:
#是不是刚刚创建的?执行shell命令
In [63]:
#经常呢,我们操作系统下的命令,比我们的代码要强In [64]:
#如果我们不想自己写命令,可以调用系统的呀In [67]:
os.system('tree')Out[67]:
0In [68]:
#我们看到的结果是一样的。In [69]:
#当然还有清屏命令,只是说这里Notebook不方便用In [ ]:
os.system('cls') #我只在这里给出改变工作目录
In [70]:
os.getcwd()Out[70]:
'C:\\Users\\Jimmy'In [71]:
#是这个地方,但是我们是可以改的。In [72]:
#如果改到桌面,我们就不用那么麻烦的删除In [73]:
os.chdir(r'C:\Users\Jimmy\Desktop')In [74]:
#可以看一下,这样就改了。In [75]:
os.getcwd()Out[75]:
'C:\\Users\\Jimmy\\Desktop'In [76]:
#当然,我们还可以改回去。In [77]:
os.chdir(r'C:\Users\Jimmy')In [78]:
#现在,又改回来了:In [79]:
os.getcwd()Out[79]:
'C:\\Users\\Jimmy'改变文件或目录的权限
In [80]:
#这个我们先不讲了,因为windows已经先分配好了文件访问权限的,你再一去改,可能电脑就不安全了,文件也乱了。In [81]:
#这个我们在Lunix上面可以用,现在windows的课程就先不用了os.path.abspath('file.name'):返回文件或目录的绝对路径
os.path.split('file_path'):将路径分隔成目录和文件名,并用一个元组返回
os.path.basename('path'):返回路径最后的文件名,如果后面还有\ /那么返回一个空字符串
os.path.exists('file_path'):如果路径存在,则返回True,反之返回False
os.path.join('file_path','file_name'):路径拼接
In [82]:
dir(os)Out[82]:
['DirEntry', 'F_OK', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'PathLike', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list', '_putenv', '_unsetenv', '_wrap_close', 'abc', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_exec_path', 'get_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getenv', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'pathsep', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sep', 'set_handle_inheritable', 'set_inheritable', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st', 'startfile', 'stat', 'stat_float_times', 'stat_result', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sys', 'system', 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'urandom', 'utime', 'waitpid', 'walk', 'write']In [83]:
#os还有很多其它函数,我们这节课只讲一些常用的,其它的会插入到以后的课程中。In [84]:
os.pathOut[84]:
<module 'ntpath' from 'C:\\ProgramData\\Anaconda3\\lib\\ntpath.py'>In [85]:
dir(os.path)Out[85]:
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_get_bothseps', '_getfinalpathname', '_getfullpathname', '_getvolumepathname', 'abspath', 'altsep', 'basename', 'commonpath', 'commonprefix', 'curdir', 'defpath', 'devnull', 'dirname', 'exists', 'expanduser', 'expandvars', 'extsep', 'genericpath', 'getatime', 'getctime', 'getmtime', 'getsize', 'isabs', 'isdir', 'isfile', 'islink', 'ismount', 'join', 'lexists', 'normcase', 'normpath', 'os', 'pardir', 'pathsep', 'realpath', 'relpath', 'samefile', 'sameopenfile', 'samestat', 'sep', 'split', 'splitdrive', 'splitext', 'splitunc', 'stat', 'supports_unicode_filenames', 'sys']In [86]:
#这是模块中的模块,它还有很多代码供我们使用。In [87]:
os.path.abspath(r'.\Desktop\a')Out[87]:
'C:\\Users\\Jimmy\\Desktop\\a'In [88]:
#它会显示出a的完整路径分隔文件夹与文件名
In [89]:
#有时候我们想把文件单独拿出来。In [90]:
#先在a目录下新建一个1.txtIn [91]:
os.path.abspath(r'.\Desktop\a\1.txt')Out[91]:
'C:\\Users\\Jimmy\\Desktop\\a\\1.txt'In [92]:
#检验到确实有这个文件In [93]:
#但是os.path.abspath这个代码只会把你那上层忽略了的目录拿出来,并不会实际地去考察。In [94]:
#例如:In [95]:
os.path.abspath(r'.\Desktop\a\2.txt')Out[95]:
'C:\\Users\\Jimmy\\Desktop\\a\\2.txt'In [96]:
#它是一样返回的In [97]:
os.path.split('.\Desktop\a\1.txt')Out[97]:
('.', 'Desktop\x07\x01.txt')In [98]:
#这只是看一下函数的具体效果In [100]:
mytuple = os.path.split('C:\\Users\\Jimmy\\Desktop\\a\\1.txt')In [101]:
mytupleOut[101]:
('C:\\Users\\Jimmy\\Desktop\\a', '1.txt')In [102]:
mytuple[0]Out[102]:
'C:\\Users\\Jimmy\\Desktop\\a'In [103]:
mytuple[1]Out[103]:
'1.txt'In [104]:
#这样就就分出来了返回路径的最后文件名
In [105]:
#这个函数其实不经常用In [106]:
os.path.basename('C:\\Users\\Jimmy\\Desktop\\a')Out[106]:
'a'In [107]:
os.path.basename('C:\\Users\\Jimmy\\Desktop\\')Out[107]:
''In [108]:
#如果没东西了,那么它返回的是空In [109]:
#用这个代码(或称“函数”)可以检验我们目录最后有没有文件判断路径是否存在
In [111]:
os.path.exists('C:\\Users\\Jimmy\\Desktop\\a\\2.txt')Out[111]:
FalseIn [112]:
os.path.exists('C:\\Users\\Jimmy\\Desktop\\a\\1.txt')Out[112]:
TrueIn [113]:
#如果有那个文件,就会返回True,如果没有该文件,则返回False。In [114]:
#判断文件夹是否存在:In [115]:
os.path.exists('C:\\Users\\Jimmy\\Desktop\\a')Out[115]:
TrueIn [116]:
#当然是在的了In [117]:
os.path.exists('C:\\Users\\Jimmy\\Desktop\\x')Out[117]:
FalseIn [118]:
#这就不在了路径拼接
In [120]:
os.path.join('C:\\A','aaaa')Out[120]:
'C:\\A\\aaaa'In [121]:
#它也是不会去检测是否有这个目录的,只是给你组起来。In [122]:
#所以最好先用exists,再使用这个函数。os.path.isdir('name'):判断是否为目录,返回值为bool
os.path.isfile('name'):判断是都为文件,返回值为bool
os.path.islink('name'):判断是否是链接,返回值为bool
os.path.getsize('path'):返回文件大小,如果文件不存在,就报错
In [123]:
#再来看一下os.path的所有函数:In [124]:
dir(os.path)Out[124]:
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_get_bothseps', '_getfinalpathname', '_getfullpathname', '_getvolumepathname', 'abspath', 'altsep', 'basename', 'commonpath', 'commonprefix', 'curdir', 'defpath', 'devnull', 'dirname', 'exists', 'expanduser', 'expandvars', 'extsep', 'genericpath', 'getatime', 'getctime', 'getmtime', 'getsize', 'isabs', 'isdir', 'isfile', 'islink', 'ismount', 'join', 'lexists', 'normcase', 'normpath', 'os', 'pardir', 'pathsep', 'realpath', 'relpath', 'samefile', 'sameopenfile', 'samestat', 'sep', 'split', 'splitdrive', 'splitext', 'splitunc', 'stat', 'supports_unicode_filenames', 'sys']判断是否为目录
In [125]:
os.path.isdir('C:\\Users\\Jimmy\\Desktop\\a\\1.txt')Out[125]:
FalseIn [126]:
#虽然是存在的文件,但是它判断的是“是否是目录”(目录 = 文件夹)In [127]:
os.path.isdir('C:\\Users\\Jimmy\\Desktop\\a')Out[127]:
TrueIn [128]:
#这样就有。判断是否是链接
In [129]:
#链接在windos下并不明显,但是在Lunix下面都是有实际的链接给出的,所以在这里我们先不讲。返回文件大小
In [130]:
os.path.getsize('C:\\Users\\Jimmy\\Desktop\\a\\1.txt')Out[130]:
0In [131]:
#现在是以KB为单位的(字节数)。
In [132]:
#是对的吧?In [133]:
#如果我们在1.txt中写入,读出的还是同步的文件大小。
In [134]:
os.path.getsize('C:\\Users\\Jimmy\\Desktop\\a\\1.txt')Out[134]:
6In [135]:
#还是一样对的。In [136]:
#如果要看文件夹大小呢,也是可以的,不过返回的是0字节。In [137]:
os.path.getsize('C:\\Users\\Jimmy\\Desktop\\a')Out[137]:
0In [138]:
#文件夹的大小跟里面文件的大小是无关的。In [139]:
#目录大小一直是0。本次只读课堂的python教程就到这了,欢迎下一次的收看!