“Python 文件操作”的版本间的差异
(→重命名文件) |
|||
(未显示2个用户的24个中间版本) | |||
第5行: | 第5行: | ||
>>>import shutil #导入shutil模块 | >>>import shutil #导入shutil模块 | ||
+ | |||
+ | >>>import time | ||
==常用操作== | ==常用操作== | ||
===创建文件=== | ===创建文件=== | ||
+ | 适用于linux: | ||
− | + | os.mknod("test.txt") #创建空文件 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | linux、windows都能用: | |
− | |||
− | + | fp = open("test.txt","w") #直接打开一个文件,如果文件不存在则创建文件 | |
− | + | fp.close() | |
− | + | ===查看文件状态=== | |
− | |||
− | === | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
import os | import os | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | os.stat('1.txt') | |
− | |||
− | === | + | <nowiki> |
− | > | + | os.stat_result(st_mode=33206, st_ino=281474977606946, st_dev=4106663517, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1649814711, st_mtime=1649814711, st_ctime=1649814711)</nowiki> |
− | + | <nowiki>st_mode: inode 保护模式 | |
+ | st_ino: inode 节点号。 | ||
+ | st_dev: inode 驻留的设备。 | ||
+ | st_nlink: inode 的链接数。 | ||
+ | st_uid: 所有者的用户ID。 | ||
+ | st_gid: 所有者的组ID。 | ||
+ | st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 | ||
+ | st_atime: 上次访问的时间。 | ||
+ | st_mtime: 最后一次修改的时间。 | ||
+ | st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。 | ||
+ | </nowiki> | ||
− | + | ===重命名文件=== | |
+ | >>> os.rename("7-1.py","7.1.py") | ||
− | + | >>> os.listdir('.') | |
− | |||
− | |||
− | |||
− | |||
+ | ['4-1.py', '5-1.py', '5-2.py', '5-3.py', '5-4.py', '5-5.py', '5-6.py', '5-7.py', '5-8.py', '6-1.py', '7.1.py', 'hamlet.txt'] | ||
− | + | os.renames("test.txt","code/test.py") | |
− | + | 用法区别: | |
− | os. | + | *os.rename(src, dst)只能对相应的文件进行重命名,不能重命名文件的上级目录名。 |
− | + | *os.renames(old, new) 是os.rename的升级, 既可以重命名文件, 也可以重命名文件的上级目录名。 | |
− | + | ===移动文件=== | |
+ | >>> os.rename("7.1.py",r"D:\teaching\自动化运维\7.1.py") | ||
− | + | ===删除文件=== | |
− | + | <nowiki>import os | |
− | + | path=r"D:\teaching\自动化运维\8.1.py" | |
− | + | if os.path.exists(path):#检查文件是否存在 | |
− | + | os.remove(path) | |
− | + | print("删除成功") | |
− | + | else: | |
− | + | print('no such file:%s'%path) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | <nowiki | ||
− | |||
− | |||
</nowiki> | </nowiki> | ||
− | |||
− | |||
===复制文件=== | ===复制文件=== | ||
− | + | import shutil | |
+ | |||
+ | shutil.copyfile("7.1.py",r"D:\teaching\自动化运维\7.1.py") | ||
'D:\\teaching\\自动化运维\\7.1.py' | 'D:\\teaching\\自动化运维\\7.1.py' | ||
− | === | + | ===递归复制文件(选学)=== |
− | + | from shutil import copytree | |
− | + | copytree(r'D:\teaching\自动化运维\2021-2022-2\OnlineMusic',r'D:\OnlineMusic') | |
'E:\\20200311\\teaching\\自动化运维\\2019-2020-2\\视频\\5. 函数和代码复用' | 'E:\\20200311\\teaching\\自动化运维\\2019-2020-2\\视频\\5. 函数和代码复用' | ||
第140行: | 第88行: | ||
'E:\\20200311\\teaching\\自动化运维\\2019-2020-2\\视频\\6. 组合数据类型' | 'E:\\20200311\\teaching\\自动化运维\\2019-2020-2\\视频\\6. 组合数据类型' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
===归档文件(打包)=== | ===归档文件(打包)=== | ||
第184行: | 第102行: | ||
返回值:返回打包文件的绝对路径和名称 | 返回值:返回打包文件的绝对路径和名称 | ||
− | > | + | <nowiki> |
− | + | import shutil | |
− | + | path_1=r'D:\Game\工匠工坊\2021-2022-2\谢良慧组_第6周\高考项目第六周工单整改' | |
− | + | path_2=r'D:\Game\工匠工坊\2021-2022-2\云计算工坊(开发)_第六周0413' | |
− | + | new_path = shutil.make_archive(path_2, 'zip', path_1)</nowiki> | |
===解档文件(解包)=== | ===解档文件(解包)=== | ||
第204行: | 第122行: | ||
− | > | + | <nowiki> |
− | + | import shutil | |
− | |||
− | + | path_1=r'D:\Game\工匠工坊\2021-2022-2\云计算工坊(开发)_第六周0413.zip' | |
+ | path_2=r'D:\Game\工匠工坊\2021-2022-2\云计算工坊(开发)_第六周0413' | ||
+ | shutil.unpack_archive(path_1,path_2)</nowiki> | ||
上面的代码将刚压缩得到的文件第六周.zip解压缩至 同名文件夹内 | 上面的代码将刚压缩得到的文件第六周.zip解压缩至 同名文件夹内 | ||
第277行: | 第196行: | ||
修改文件权限与时间戳:os.chmod(file) | 修改文件权限与时间戳:os.chmod(file) | ||
+ | ===查看文件类型=== | ||
+ | >>> os.path.isfile("7.1.py") | ||
+ | True | ||
+ | >>> os.path.isdir("7.1.py") | ||
+ | |||
+ | False | ||
+ | |||
+ | ===查看文件时间=== | ||
+ | 对于linux中的文件或者目录中有3个时间,分别是:atime、ctime、mtime.[1] | ||
+ | |||
+ | *atime:Access time,最后一次访问文件(读取或执行)的时间。 | ||
+ | |||
+ | *citme:Change time,最后一次改变文件(属性)或者目录(属性)的时间。 | ||
+ | |||
+ | *mtime:Modify time,最后一次改变文件(内容)或目录(内容)的时间。 | ||
+ | |||
+ | 查看文件修改时间,以mtime为例:: | ||
+ | |||
+ | >>> t =os.stat("1.txt").st_atime | ||
+ | |||
+ | >>> import time | ||
+ | |||
+ | >>> t2 =time.localtime(t) | ||
+ | |||
+ | >>> t2 | ||
+ | |||
+ | >>> t3 = time.strftime('%Y-%m-%d %H:%M:%S',t2) | ||
+ | |||
+ | >>> t3 | ||
+ | |||
+ | <nowiki>'2023-02-21 09:02:56'</nowiki> | ||
+ | |||
+ | 函数整理: | ||
+ | |||
+ | <nowiki>import time | ||
+ | import os | ||
+ | def file_modified_time(name): | ||
+ | mt=os.stat(name).st_mtime | ||
+ | mt2 =time.localtime(mt) | ||
+ | mt3=time.strftime('%Y-%m-%d %H:%M:%S',mt2) | ||
+ | return mt3 | ||
+ | |||
+ | modified_time = file_modified_time('hamlet.txt') | ||
+ | print('hamlet.txt',"修改时间",modified_time)</nowiki> | ||
+ | |||
+ | ===查看文件大小=== | ||
+ | >>> os.path.getsize('hamlet.txt') | ||
+ | |||
+ | 180768 | ||
+ | |||
+ | 函数整理: | ||
+ | |||
+ | <nowiki>def get_size(name): | ||
+ | size=os.path.getsize(name) | ||
+ | size /= 1024 #换算为KB | ||
+ | size = round(size,2)#保留2位小数 | ||
+ | r | ||
+ | </nowiki> | ||
+ | |||
+ | ===查看文件权限=== | ||
+ | |||
+ | <nowiki> | ||
+ | >>> os.stat('1.txt').st_mode | ||
+ | 33206 | ||
+ | >>> oct(os.stat('1.txt').st_mode) | ||
+ | '0o100666' | ||
+ | >>> oct(os.stat('1.txt').st_mode)[-3:] | ||
+ | '666'</nowiki> | ||
+ | |||
+ | ===修改文件权限=== | ||
+ | os.chmod() 方法用于更改文件或目录的权限。 | ||
+ | 语法 | ||
+ | |||
+ | chmod()方法语法格式如下: | ||
+ | |||
+ | os.chmod(path, mode) | ||
+ | |||
+ | 参数 | ||
+ | |||
+ | path -- 文件名路径或目录路径。 | ||
+ | |||
+ | flags -- 可用以下选项按位或操作生成, 目录的读权限表示可以获取目录里文件名列表, ,执行权限表示可以把工作目录切换到此目录 ,删除添加目录里的文件必须同时有写和执行权限 ,文件权限以用户id->组id->其它顺序检验,最先匹配的允许或禁止权限被应用。 | ||
+ | stat.S_IXOTH: 其他用户有执行权0o001 | ||
+ | stat.S_IWOTH: 其他用户有写权限0o002 | ||
+ | stat.S_IROTH: 其他用户有读权限0o004 | ||
+ | stat.S_IRWXO: 其他用户有全部权限(权限掩码)0o007 | ||
+ | stat.S_IXGRP: 组用户有执行权限0o010 | ||
+ | stat.S_IWGRP: 组用户有写权限0o020 | ||
+ | stat.S_IRGRP: 组用户有读权限0o040 | ||
+ | stat.S_IRWXG: 组用户有全部权限(权限掩码)0o070 | ||
+ | stat.S_IXUSR: 拥有者具有执行权限0o100 | ||
+ | stat.S_IWUSR: 拥有者具有写权限0o200 | ||
+ | stat.S_IRUSR: 拥有者具有读权限0o400 | ||
+ | stat.S_IRWXU: 拥有者有全部权限(权限掩码)0o700 | ||
+ | stat.S_ISVTX: 目录里文件目录只有拥有者才可删除更改0o1000 | ||
+ | stat.S_ISGID: 执行此文件其进程有效组为文件所在组0o2000 | ||
+ | stat.S_ISUID: 执行此文件其进程有效用户为文件所有者0o4000 | ||
+ | stat.S_IREAD: windows下设为只读 | ||
+ | stat.S_IWRITE: windows下取消只读 | ||
+ | |||
+ | 返回值: 该方法没有返回值。 | ||
+ | |||
+ | 实例: | ||
+ | |||
+ | <nowiki>>>> import os,sys,stat | ||
+ | >>> os.chmod(r"D:\teaching\自动化运维\test.txt",stat.S_IREAD) | ||
+ | >>> os.chmod(r"D:\teaching\自动化运维\test.txt",stat.S_IWRITE) | ||
+ | </nowiki> | ||
+ | |||
+ | ===查找文件=== | ||
+ | 利用递归函数: | ||
+ | |||
+ | <nowiki> | ||
+ | import os | ||
+ | from os.path import join,isdir,isfile | ||
+ | testfiles = [] | ||
+ | testfilepaths = [] | ||
+ | L = len(os.path.abspath('.')) | ||
+ | |||
+ | def searchfile(path,keyWords): | ||
+ | for item in os.listdir(path): | ||
+ | item_path = os.path.join(path, item); | ||
+ | if isdir(item_path): | ||
+ | searchfile(item_path,keyWords) | ||
+ | elif isfile(item_path): | ||
+ | if keyWords in item: | ||
+ | print(item_path) | ||
+ | |||
+ | keywords = input("请输入关键词:") | ||
+ | searchfile(r'D:\teaching\自动化运维',keywords) | ||
+ | </nowiki> | ||
− | |||
+ | 练习:1写一个shell解释器,给出linux命令,写出对应的python写法 | ||
[1]Linux中的ctime、atime、mtime理解:https://blog.csdn.net/qq_36795474/java/article/details/80215856 | [1]Linux中的ctime、atime、mtime理解:https://blog.csdn.net/qq_36795474/java/article/details/80215856 | ||
[2]Python基础---文件File的处理_make_archive()归档、解包、压缩、解压: https://blog.csdn.net/abcdasdff/article/details/82528658 | [2]Python基础---文件File的处理_make_archive()归档、解包、压缩、解压: https://blog.csdn.net/abcdasdff/article/details/82528658 |
2023年4月23日 (日) 08:04的最新版本
目录
引入模块
>>> import os
>>> import os.path
>>>import shutil #导入shutil模块
>>>import time
常用操作
创建文件
适用于linux:
os.mknod("test.txt") #创建空文件
linux、windows都能用:
fp = open("test.txt","w") #直接打开一个文件,如果文件不存在则创建文件
fp.close()
查看文件状态
import os
os.stat('1.txt')
os.stat_result(st_mode=33206, st_ino=281474977606946, st_dev=4106663517, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1649814711, st_mtime=1649814711, st_ctime=1649814711)
st_mode: inode 保护模式 st_ino: inode 节点号。 st_dev: inode 驻留的设备。 st_nlink: inode 的链接数。 st_uid: 所有者的用户ID。 st_gid: 所有者的组ID。 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 st_atime: 上次访问的时间。 st_mtime: 最后一次修改的时间。 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
重命名文件
>>> os.rename("7-1.py","7.1.py")
>>> os.listdir('.')
['4-1.py', '5-1.py', '5-2.py', '5-3.py', '5-4.py', '5-5.py', '5-6.py', '5-7.py', '5-8.py', '6-1.py', '7.1.py', 'hamlet.txt']
os.renames("test.txt","code/test.py")
用法区别:
- os.rename(src, dst)只能对相应的文件进行重命名,不能重命名文件的上级目录名。
- os.renames(old, new) 是os.rename的升级, 既可以重命名文件, 也可以重命名文件的上级目录名。
移动文件
>>> os.rename("7.1.py",r"D:\teaching\自动化运维\7.1.py")
删除文件
import os path=r"D:\teaching\自动化运维\8.1.py" if os.path.exists(path):#检查文件是否存在 os.remove(path) print("删除成功") else: print('no such file:%s'%path)
复制文件
import shutil
shutil.copyfile("7.1.py",r"D:\teaching\自动化运维\7.1.py")
'D:\\teaching\\自动化运维\\7.1.py'
递归复制文件(选学)
from shutil import copytree
copytree(r'D:\teaching\自动化运维\2021-2022-2\OnlineMusic',r'D:\OnlineMusic')
'E:\\20200311\\teaching\\自动化运维\\2019-2020-2\\视频\\5. 函数和代码复用'
下面的代码使用shutil的copytree()函数递归复制文件夹,并忽略 docx扩展名 和以‘测试'开头的文件
>>> from shutil import copytree,ignore_patterns
>>> copytree(r'D:\teaching\自动化运维\2019-2020-2\视频\6. 组合数据类型',r'E:\20200311\teaching\自动化运维\2019-2020-2\视频\6. 组合数据类型',ignore=ignore_patterns('*.docx','测试*'))
'E:\\20200311\\teaching\\自动化运维\\2019-2020-2\\视频\\6. 组合数据类型'
归档文件(打包)
归档函数:make_archive()[2]
语法:shutil.make_archive(base_name, format, base_dir)
base_name ---> 创建的目标文件名,包括路径,减去任何特定格式的扩展
format ---> 压缩包格式后缀:zip、tar、bztar、gztar
base_dir ---> 开始打包的路径
返回值:返回打包文件的绝对路径和名称
import shutil path_1=r'D:\Game\工匠工坊\2021-2022-2\谢良慧组_第6周\高考项目第六周工单整改' path_2=r'D:\Game\工匠工坊\2021-2022-2\云计算工坊(开发)_第六周0413' new_path = shutil.make_archive(path_2, 'zip', path_1)
解档文件(解包)
解包:将归档的文件进行释放
解包函数:unpack_archive()
语法:shutil.unpack_archive(filename, extract_dir)
filename ---> 需要解包的文件,需要写明文件的后缀
extract_dir ---> 解包后文件存放位置
返回值:None
import shutil path_1=r'D:\Game\工匠工坊\2021-2022-2\云计算工坊(开发)_第六周0413.zip' path_2=r'D:\Game\工匠工坊\2021-2022-2\云计算工坊(开发)_第六周0413' shutil.unpack_archive(path_1,path_2)
上面的代码将刚压缩得到的文件第六周.zip解压缩至 同名文件夹内
思考:如何编写函数,使得可以自动解压至同名文件夹?
压缩文件
1、导入zipfile模块:import zipfile
2、创建压缩文件:zp = zipfile.ZipFile(file, mode=' ', compression=' ', allowZip64=)
file :创建zip压缩包的路径和名称
mode :模式 w、r、a
compression :zipfile.ZIP_STORED 默认值,压缩处理后,不改变文件大小
zipfile.ZIP_DEFLATED 压缩处理后,缩小
allowZip64 :操作超过2G大小的zip文件,需要设置该参数为True
3、在zip文件中添加内容:zp.write(filename, arcname) # 只能对文件进行添加,如果添加的是文件夹,则压缩结果是一个空的文件夹
filename :添加内容的路径和名称
arcname :添加后的新名称,默认为None不变
4、关闭压缩文件:zp.close()
实例:
>>> import zipfile >>> zip_path = r'D:\Work\教学\2019-2020-2\第六周.zip' >>> zp = zipfile.ZipFile(zip_path, 'a', zipfile.ZIP_DEFLATED) >>> zp.write(r'D:\Work\教学\2019-2020-2\第6周\签到.docx','签到.docx') >>> zp.write(r'D:\Work\教学\2019-2020-2\第6周\模板.docx','网课模板.docx') >>> zp.close()
解压缩文件
1、打开zip文件:zp = zipfile.ZipFile(zip_path, 'r')
2、解压:1、指定其中的某个单个文件:zp.extract(member, path)
member 文件名,n. 成员
path 解压后的位置
2、解压全部文件:zp.extractall(path)
3、关闭文件:zp.close()
>>> import zipfile >>> zip_path = r'D:\Work\教学\2019-2020-2\第六周.zip' >>> zp = zipfile.ZipFile(zip,path,'r') Traceback (most recent call last): File "<pyshell#43>", line 1, in <module> zp = zipfile.ZipFile(zip,path,'r') NameError: name 'path' is not defined >>> zp = zipfile.ZipFile(zip_path,'r') >>> zp.extract('签到.docx','.') '签到.docx' >>> zp.extractall('.')
修改文件权限与时间戳:os.chmod(file)
查看文件类型
>>> os.path.isfile("7.1.py")
True
>>> os.path.isdir("7.1.py")
False
查看文件时间
对于linux中的文件或者目录中有3个时间,分别是:atime、ctime、mtime.[1]
- atime:Access time,最后一次访问文件(读取或执行)的时间。
- citme:Change time,最后一次改变文件(属性)或者目录(属性)的时间。
- mtime:Modify time,最后一次改变文件(内容)或目录(内容)的时间。
查看文件修改时间,以mtime为例::
>>> t =os.stat("1.txt").st_atime
>>> import time
>>> t2 =time.localtime(t)
>>> t2
>>> t3 = time.strftime('%Y-%m-%d %H:%M:%S',t2)
>>> t3
'2023-02-21 09:02:56'
函数整理:
import time import os def file_modified_time(name): mt=os.stat(name).st_mtime mt2 =time.localtime(mt) mt3=time.strftime('%Y-%m-%d %H:%M:%S',mt2) return mt3 modified_time = file_modified_time('hamlet.txt') print('hamlet.txt',"修改时间",modified_time)
查看文件大小
>>> os.path.getsize('hamlet.txt')
180768
函数整理:
def get_size(name): size=os.path.getsize(name) size /= 1024 #换算为KB size = round(size,2)#保留2位小数 r
查看文件权限
>>> os.stat('1.txt').st_mode 33206 >>> oct(os.stat('1.txt').st_mode) '0o100666' >>> oct(os.stat('1.txt').st_mode)[-3:] '666'
修改文件权限
os.chmod() 方法用于更改文件或目录的权限。 语法
chmod()方法语法格式如下:
os.chmod(path, mode)
参数
path -- 文件名路径或目录路径。
flags -- 可用以下选项按位或操作生成, 目录的读权限表示可以获取目录里文件名列表, ,执行权限表示可以把工作目录切换到此目录 ,删除添加目录里的文件必须同时有写和执行权限 ,文件权限以用户id->组id->其它顺序检验,最先匹配的允许或禁止权限被应用。 stat.S_IXOTH: 其他用户有执行权0o001 stat.S_IWOTH: 其他用户有写权限0o002 stat.S_IROTH: 其他用户有读权限0o004 stat.S_IRWXO: 其他用户有全部权限(权限掩码)0o007 stat.S_IXGRP: 组用户有执行权限0o010 stat.S_IWGRP: 组用户有写权限0o020 stat.S_IRGRP: 组用户有读权限0o040 stat.S_IRWXG: 组用户有全部权限(权限掩码)0o070 stat.S_IXUSR: 拥有者具有执行权限0o100 stat.S_IWUSR: 拥有者具有写权限0o200 stat.S_IRUSR: 拥有者具有读权限0o400 stat.S_IRWXU: 拥有者有全部权限(权限掩码)0o700 stat.S_ISVTX: 目录里文件目录只有拥有者才可删除更改0o1000 stat.S_ISGID: 执行此文件其进程有效组为文件所在组0o2000 stat.S_ISUID: 执行此文件其进程有效用户为文件所有者0o4000 stat.S_IREAD: windows下设为只读 stat.S_IWRITE: windows下取消只读
返回值: 该方法没有返回值。
实例:
>>> import os,sys,stat >>> os.chmod(r"D:\teaching\自动化运维\test.txt",stat.S_IREAD) >>> os.chmod(r"D:\teaching\自动化运维\test.txt",stat.S_IWRITE)
查找文件
利用递归函数:
import os from os.path import join,isdir,isfile testfiles = [] testfilepaths = [] L = len(os.path.abspath('.')) def searchfile(path,keyWords): for item in os.listdir(path): item_path = os.path.join(path, item); if isdir(item_path): searchfile(item_path,keyWords) elif isfile(item_path): if keyWords in item: print(item_path) keywords = input("请输入关键词:") searchfile(r'D:\teaching\自动化运维',keywords)
练习:1写一个shell解释器,给出linux命令,写出对应的python写法
[1]Linux中的ctime、atime、mtime理解:https://blog.csdn.net/qq_36795474/java/article/details/80215856 [2]Python基础---文件File的处理_make_archive()归档、解包、压缩、解压: https://blog.csdn.net/abcdasdff/article/details/82528658