前两篇文章,我们说了Python编程风格和Python基本语法中的数据类型Python零基础教学,从入门到精通,你学到了吗?Python编程风格及Python基本语法(上篇)
这节课我们继续学习进阶版内容--文件管理!
文件管理函数简介
open函数
Python内置函数,有8个参数,完整语法如下:
open(file,mode=’r’,buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)
除了file,其他7个参数都有默认值。
file是要打开的文件,包含文件路径和文件名,若不配置路径,则会去.py文件同目录搜寻。
mode用于指定文件打开模式,如r,w,a,分别对应读,写,追加的方式,附加模式有b,t,+,分别对应二进制模式,文本模式,读写模式,附加模式需要与基本模式组合使用,如rb表示以二进制只读模式打开文件,rb+表示以二进制读写模式打开文件。
buffering用于指定打开文件使用的缓冲方式,-1表示使用系统默认的缓冲机制。可以是任意正整数,负整数或0,值为任意负整数,效果是相同的;值为0,则表示不使用缓冲区,即缓冲区大小为0,写入和读取都直接与磁盘对接;值为1,则表示缓冲区采用行缓冲区,即只能放一行数据,遇到换行符即清空缓存,将数据存入磁盘;值大于1,这个值表示缓冲区的大小,单位为字节,如200,表示缓冲区大小为200Byte,数据达到200Byte就会写入磁盘。
encoding用于指定文件的编码方式,默认采用UTF-8,常用的还有ascii,gbk等
errors是指编解码报错的处理方式,用于设置党open函数发生编码或解码错误时的处理方式,值为:strict(编解码错误则报错),ignore(编解码出现错误会忽略,不报错),replace(编解码出现错误不会报错,会用?替代要写入或读取的我无法解析的数据)。值得注意的是,当mode参数采用二进制方式时,不可指定该参数值。
newline是指换行符设置,可选值:None、”\r”、”\n”、”\r\n”。Windows采用”\r\n”,MacOSSierra采用”\r”,Unix和Linux使用”\n”
closefd是指传入的file参数类型。Bool类型,为True时,file参数可以是表示文件路径的字符串,也可以是文件描述符;为false时,file参数只能是文件描述符,传入字符串会报错。
opener具体含义暂不清楚。
os库
os是operation system的缩写,是Python标准库,随Python一起安装,无需单独安装,os库中包含很多操作文件和目录的函数,可以很方便第进行重命名文件、添加/删除目录、复制目录/文件等操作。
使用os库时需要导入:import os,主要操作方法如下:
['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', '_AddedDllDirectory', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_check_methods', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list', '_putenv', '_unsetenv', '_wrap_close', 'abc', 'abort', 'access', 'add_dll_directory', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', '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_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']
基本操作如下图:
shutil
shutil库也是Python标准库,可以处理文件、文件夹、压缩包,能实现文件复制、移动、压缩、解压缩等功能。
使用时需要导入:import shutil
主要的类和函数如下:
['COPY_BUFSIZE', 'Error', 'ExecError', 'ReadError', 'RegistryError', 'SameFileError', 'SpecialFileError', '_ARCHIVE_FORMATS', '_BZ2_SUPPORTED', '_GiveupOnFastCopy', '_HAS_FCOPYFILE', '_LZMA_SUPPORTED', '_UNPACK_FORMATS', '_USE_CP_SENDFILE', '_WINDOWS', '_ZLIB_SUPPORTED', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_access_check', '_basename', '_check_unpack_options', '_copyfileobj_readinto', '_copytree', '_copyxattr', '_destinsrc', '_ensure_directory', '_fastcopy_fcopyfile', '_fastcopy_sendfile', '_find_unpack_format', '_get_gid', '_get_uid', '_islink', '_make_tarball', '_make_zipfile', '_ntuple_diskusage', '_rmtree_isdir', '_rmtree_islink', '_rmtree_safe_fd', '_rmtree_unsafe', '_samefile', '_stat', '_unpack_tarfile', '_unpack_zipfile', '_use_fd_functions', 'chown', 'collections', 'copy', 'copy2', 'copyfile', 'copyfileobj', 'copymode', 'copystat', 'copytree', 'disk_usage', 'errno', 'fnmatch', 'get_archive_formats', 'get_terminal_size', 'get_unpack_formats', 'getgrnam', 'getpwnam', 'ignore_patterns', 'make_archive', 'move', 'nt', 'os', 'posix', 'register_archive_format', 'register_unpack_format', 'rmtree', 'stat', 'sys', 'unpack_archive', 'unregister_archive_format', 'unregister_unpack_format', 'which']
常用操作函数:
copy复制文件和权限
copy2复制文件和元数据
copyfile将一个文件的内容复制到另一个文件中
copyfileobj将一个文件的内容复制到另一个文件中
copytree复制整个文件目录
move递归地移动文件或目录,原文件或目录将会被删除
rmtree删除一个目录及目录内所有内容
make_archive创建压缩包并返回文件路径
unpack_archive解压缩文件
open()与os.open()
open()方法用于打开一个文件,并返回文件对象,高级函数。
os.open()方法用于打开一个文件,并设置需要的打开选项,默认参数mode是可选的,默认值0777,返回值是新打开文件的描述符,底层函数。
open()实际上是对os.open()的封装,问了操作方便则调用内置函数open(),为了效率高则可用os.open()
案例一 统计文件中汉字出现的次数
文档内容如下:
程序:
输出结果:
Counter({'山': 6, '还': 4, '联': 3, '上': 3, '下': 3, '有': 3, '海': 2, '自': 2, '来': 2, '黄': 2, '落': 2, '叶': 2, '牧': 2, '马': 2, '停': 2, '前': 2, '门': 2, '出': 2, '租': 2, '车': 2, '西': 2, '运': 2, '煤': 2, '对': 1, '水': 1, '松': 1, '人': 1, '别': 1, '是': 1, '不': 1})
案例二 真正的文件类型
在日常工作中,我们常常用文件的扩展名来判断文件类型,其实这不够准确。如果我们修改了文件的扩展名,虽然文件图标和文件类型都发生了变化,但是文件大小没变,文件的内容和本质也没变。
那什么方式才是准确的呢?
准确的方式是查看文档的文档头,也就是前8个字节。
下面我们来用Python查看文档的文件类型:
输出结果:
可以看出,结果是一样的。
感兴趣的朋友可以试试其他的文档,比如word,pdf,png,rar等,你会发现不一样的世界。
案例三 批量修改文件名称
在文件名称的前面加0,后面加2022,不改变文件的格式。
输出结果:
案例四 文件目录图
假设现在我们有一个目录:
文件夹:D:\PycharmProjects\Points
Points文件夹下有0words2022.docx、0words2022.png、0words2022.txt、文件夹points;
points文件夹下又有文件夹0point、0word2022.docx、0word2022.png、0word2022.txt、文件夹point1;
文件夹0point下又有word.docx、word.png
文件夹point1下又有word.docx
图片效果为:
我们要整理成目录的样子,代码如下:
输出结果: