文件操作
Posted 542684416-qq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件操作相关的知识,希望对你有一定的参考价值。
文件操作
目录管理(os)
-
示例
# 执行系统命令 # 清屏 # os.system(‘cls‘) # 调出计算器 # os.system(‘calc‘) ? # 查看操作系统类型 # nt:表示windows,posix:表示类unix # print(os.name)
-
查看当前工作目录
import os #查看当前工作目录 print(os.getcwd())
-
创建目录:mkdir
# os.mkdir(‘test‘) # 不能创建中间目录 os.mkdir(‘a/b/c‘)
-
创建目录:makedirs
# 可以创建中间目录 os.makedirs(‘a/b/c‘)
-
删除目录:rmdir
# 删除目录:只能是空目录,如果‘test’下还有目录,删除test下的文件,必须指定路径 os.rmdir(‘test/a‘) # os.rmdir(‘test‘) # 不能删除非空目录 os.rmdir(‘a‘)
-
修改名称:rename
# 重命名:目录和文件都可以 # os.rename(‘a‘, ‘aa‘) os.rename(‘test.py‘, ‘t.py‘)
-
查看文件信息:stat
# 查看文件信息:可以是目录 print(os.stat(‘t.py‘)) print(os.stat(‘aa‘))
-
查看目录文件信息:listdir
# 查看目录文件信息 print(os.listdir(os.getcwd()))
-
path:关于目录相关的模块
from os import path import os ? # 目录拼接 # print(path.join(‘abc/def/‘, ‘hello.py‘)) ? # 提取目录 # print(path.dirname(‘abc/def/hello.py‘)) # print(path.dirname(os.getcwd())) ? # 提取文件名 # print(path.basename(‘abc/def/hello.py‘)) # print(path.basename(os.getcwd())) ? # 切割路径与文件名 # print(path.split(‘abc/def/hello.py‘)) # dir, name = path.split(‘abc/def/hello.py‘) # print(dir, name) ? # 切割文件名与后缀 # print(path.splitext(‘hello.py‘)) # print(path.splitext(‘abc/def/hello.py‘)) ? # 判断文件是否存在,可以是目录 # print(path.exists(‘aa‘)) ? # 判断是否是目录文件 # print(path.isdir(‘t.py‘)) # print(path.isdir(‘aa‘)) ? # 判断是否是普通文件 # print(path.isfile(‘t.py‘)) # print(path.isfile(‘aa‘)) ? # 获取文件大小,仅限于文件 print(path.getsize(‘t.py‘)) # 对于目录会有问题 print(path.getsize(‘aa‘))
练习:统计一个目录的大小,需要使用递归
文件管理
-
打开文件(open)
-
示例
fp = open(‘00-test.txt‘, ‘r‘)
-
参数
file:操作的文件名 mode:打开的方式 endoding:编码方式,通常不用指定,系统会自动识别
-
打开方式
r:只读方式,文件不存在会报错
w:只写方式,文件不存在则创建,存在则清空
a:追加方式,文件不存在则创建,存在直接打开(不会清空),只能向最后追加
r+:在r方式基础上添加可写的权限
w+:在w方式基础上添加可读的权限
a+:在a方式基础上添加可读的权限
?
在上面的打开上添加一个字符b,表示以二进制的方式进行操作:rb、wb、ab、rb+、wb+、ab+
说明:没有添加b的打开方式,默认的读写都是以字符串形式操作的, 带b的是以bytes形式进行的-
编码方式
ASCII:美国信息交换标准代码(128) ansi:扩展的ASCII(256) gb2312:中国的ansi gbk:扩充的gb2312 ? unicode:万国码,将所有国家的所有字符全部进行统一编码 utf-8:一种可变长度的unicode实现方案,而且对中文支持比较友好。
-
-
关闭文件
fp.close()
-
文件读写
# 判断是否可读 # print(fp.readable()) # 读取指定长度内容 # content = fp.read(5) # 读取一行 # content = fp.readline() # 读取所有的行,返回一个列表 # content = fp.readlines() ? # 判断是否可写 # print(fp.writable()) # 写入内容 # fp.write(‘hello‘)
-
操作位置
# 文件操作位置 # print(fp.tell()) ? # 设置操作位置 # 参数1:偏移量 # 参数2:参考位置,0:开头,1:当前位置,2:结束 # 以bytes形式读写seek没有问题,以str型是读写的seek只能设置从开头偏移 fp.seek(5, 0)
-
文件删除
os.remove(‘文件名‘)
练习:删除一个目录,需要使用递归
bytes类型
-
示例:
# s = b‘hello‘ # print(s) # print(type(s)) ? # 编码:str => bytes s = ‘hello‘.encode(‘utf-8‘) print(type(s)) ? # 解码:bytes => str b = s.decode(‘utf-8‘) print(b, type(b))
自行学习
-
StringIO
-
BytesIO
环境变量
-
设置:
set 名称=值
-
获取:
set 名称
-
代码:
import os ? # 获取环境变量 # print(os.environ[‘path‘]) # 不存在也不报错 # print(os.environ.get(‘abc‘, ‘hello‘)) # 等价于上面的式子 print(os.getenv(‘abc‘, ‘world‘))
目录表示
-
相对目录:有参考的目录
-
‘.‘表示当前目录,‘./‘通常可以省略
-
‘..‘表示上一级目录,上上一级目录:
../../
-
-
绝对目录:
-
windows:盘符开头的目录
-
类unix:以‘/‘开头的目录
-
-
目录分隔符
-
windows:‘/‘ 或 ‘‘
-
类unix:‘/‘
-
建议:统一使用‘/‘
-
练习:路径信息全部需要拼接
-
实现一个文件的拷贝功能,注意:大文件的问题
import shutil #拷贝文件 shutil.copy(‘***‘,‘****‘)
-
#实现一个文件的拷贝功能,注意:大文件的问题 import os def copy(src,dst): #判断是否是同一文件 if os.path.abspath(src) == os.path.abspath(dst): print(‘地址相同,无法拷贝‘) return #判断源文件是否是文件 if os.path.isfile(src): print(‘不是文件怎么拷贝?‘) return #判断目标地址是否是目录 if os.path.isdir(dst): #提取原文件名字 src_name = os.path.basename(src) #拼接目标文件名 dst = os.path.join(dst,src_name) #打开文件 src_fp = open(src,‘r‘) dst_fp = open(dst,‘w‘) #循环拷贝 while True: #一次读取指定长度的内容 content = src_fp.read(1024) #判断是否为空 if len(content) == 0: break #写入目标文件 dst_fp.write(content) #关闭文件 src_fp.close() dst_fp.close() #拷贝时指定文件名 # copy(‘00-test.txt‘,‘00-test2.txt‘) #拷贝时不指定文件名 copy(‘00-test.txt‘,‘abc‘)
-
删除一个目录
shutil.rmtree(‘目录‘)
-
import os def remove(file): #判断文件是否存在 if not os.path.exists(file): print(file,‘文件不存在,无法删除‘) return #是普通文件 if os.path.isfile(file): os.remove(file) return dirs = os.listdir(file) for f in dirs: #拼接完整文件名 file_name = os.path.join(file,f) #判断文件类型 if os.path.isfile(f): #是否是普通文件 os.remove(file_name) else: #是目录文件 remove(file_name) #删除目录 os.rmdir(file) ? remove(‘.ida‘)
-
统计一个目录的大小
import os def size(file): #判断是否存在 if not os.path.exists(file): print(‘文件不存在,无法处理‘) return #判断是否是普通文件 if os.path.isfile(file): return os.path.getsize(file) #是目录需要统计一下 total = 0 dirs = os.listdir(file) for f in dirs: #拼接完整路径名 file_name = os.path.join(file,f) #判断类型 if os.path.isfile(file_name): total += os.path.getsize(file_name) else: total += size(file_name) return total print(size(‘09-test.py‘))
-
拷贝一个目录
shutil.copytree(‘***‘,‘****‘)
-
#拷贝目录 #‘abc‘--‘bca‘ def copy_dir(src,dst): # 判断是否是同一文件 if os.path.abspath(src) == os.path.abspath(dst): print(‘地址相同,无法拷贝‘) return #判断文件类型 if os.path.isfile(src): print(src,‘是文件,无法拷贝‘) return #判断目标地是否存在 if not os.path.exists(dst): #创建目标地址 os.makedirs(dst) #判断目标地址是否是目录 if not os.path.isdir(dst): print(‘目标地址不是目录,无法拷贝‘) return dirs = os.listdir(src) for f in dirs: #拼接路径 src_file = os.path.join(src,f) dst_file = os.path.join(dst,f) if os.path.isdir(src_file): #是普通文件 copy(src_file,dst_file) else: #是目录,递归处理 copy_dir(src_file,dst_file) copy_dir(‘abc‘,‘cba‘)
-
移动一个目录
shutil.move(‘‘)
-
import os def move(src,dst): if os.path.abspath(src) == os.path.abspath(dst): print(‘地址相同,无法移动‘) return if os.path.isdir(src): src_fp = open(src,‘r‘) dst_fp = open(dst,‘w‘) while True: content = src_fp.read(1024) # 判断是否为空 if len(content) == 0: break # 写入目标文件 dst_fp.write(content) # 关闭文件 src_fp.close() dst_fp.close() #删除源文件 os.remove(src) else: if not os.path.exists(dst): os.makedirs(dst) dirs = os.listdir(src) for f in dirs: src_file = os.path.join(src,f) dst_file = os.path.join(dst, f) move(src_file,dst_file) #删除原空目录 os.rmdir(src) move(‘***‘,‘***‘)
-
整理目录
-
一个目录下有各种文件,包括文件夹
-
将所有的目录文件都放到DIRS目录下
-
所有无后缀的文件统一放到OTHERS目录下
-
有后缀的文件放到后缀大写的目录下
-
示例:
整理前:
test/
dir1/
dir2/
dir3/
1.py
2.py
3.txt
4.pdf
123
456
整理后:
test/
DIRS/
dir1/
dir2/
dir3/
OTHERS/
123
456
PY/
1.py
2.py
TXT/
3.txt
PDF/
4.pdfimport os import shutil ? def deal(dir): if os.path.isdir(dir): print(‘是文件‘) return dirs = os.listdir(dir) for f in dirs : #拼接完整路径 file_name = os.path.join(dir,f) #分类处理 if os.path.isdir(file_name): #是目录 #拼接DIRS目录名 DIRS = os.path.join(dir,‘DIRS‘) #创建 if not os.path.exists(DIRS): os.makedirs(DIRS) #移动 shutil.move(file_name,DIRS) else: #按照‘。’进行切割 lt = file_name.rsplit(‘.‘,1) if len(lt) == 1: #没有后缀 #OTHERS OTHERS = os.path.join(dir, ‘OTHERS‘) # 创建 if not os.path.exists(OTHERS): os.makedirs(OTHERS) # 移动 shutil.move(file_name, OTHERS) else: # OTHERS SUFFIX = os.path.join(dir, ‘SUFFIX‘) # 创建 if not os.path.exists(SUFFIX): os.makedirs(SUFFIX) # 移动 shutil.move(file_name, SUFFIX) deal(‘***‘)
?
-
以上是关于文件操作的主要内容,如果未能解决你的问题,请参考以下文章