1、python脚本中为什么要在目录前加一个r
r是保持字符串原始值的意思,就是说不对其中的符号进行转义。因为windows下的目录字符串中通常有斜杠"\",而斜杠在Python的字符串中有转义的作用。例如:\n表示换行如果路径中有\new就会被转义。加上r就是为了避免这种情况。
2、文件重命名
os.rename() 方法用于命名文件或目录,从 src 到 dst,如果dst是一个存在的目录, 将抛出OSError。
3、os.remove(path)、shutil.move(path)、os.rmdir(path)
- os.remove() 方法用于删除指定路径的文件。如果指定的路径是一个目录,将抛出OSError。
- shutil.move() 移动文件(目录)
- os.rmdir(path) path是文件夹路径,注意文件夹需要时空的才能被删除
4、python中os.path常用模块
os.path.sep:路径分隔符 linux下就用这个了’/’
print os.path.sep # win和linux下的不一样,如果脚本在win下开发,在linux下面跑,可以这个,避免报错
/
os.path.altsep: 根目录
os.path.curdir:当前目录
os.path.pardir:父目录
os.path.abspath(path):绝对路径
os.path.join(): 常用来链接路径
os.path.split(path): 把path分为目录和文件两个部分,以列表返回
print os.path.split('/root/pp/f.c')
('/root/pp', 'f.c')
5、文件读取
(1)找出当前文件下的所有.jpg图片
(2)获取当前文件的文件(包括文件和文件夹)
import os
os.listdir
方法可以对比使用,都是列出路径下的文件名或图片名并且存入list列表,进行for循环取出,构建绝对路径即可对该文件进行遍历操作。
(3)获取当前文件下所有文件(包括文件夹下的文件)
imagePaths = sorted(list(paths.list_images(r"./images/train")))
import os
path = r'H:\2020毕业前机器学习总结\测试代码\keras-resnet-master'
Filles = []
Dirs = []
for root,dirs,files in os.walk(path):
for file in files:
tmp = os.path.join(root,file)
# if tmp == "ss":
# Filles.append()
for dir in dirs:
Dirs.append(os.path.join(root,dir))
(4)处理文件名获取有用信息(比如分割文件名挑选有用信息,比如标签)
(5)文件名批量修改
# --** coding="UTF-8" **--
#
# author:SueMagic time:2019-01-01
import os
import re
import sys
fileList = os.listdir(r"./neteasy_playlist_data3")
# 输出此文件夹中包含的文件名称
print("修改前:" + str(fileList)[1])
# 得到进程当前工作目录
currentpath = os.getcwd()
# 将当前工作目录修改为待修改文件夹的位置
os.chdir(r"./neteasy_playlist_data3")
# 名称变量
num = 1
# 遍历文件夹中所有文件
for fileName in fileList:
# 匹配文件名正则表达式
pat = ".+\.(json)"
# 进行匹配
pattern = re.findall(pat, fileName)
# 文件重新命名
os.rename(fileName, (str(num + 839) + '.' + pattern[0]))
# 改变编号,继续下一项
num = num + 1
print("***************************************")
# 改回程序运行前的工作目录
os.chdir(currentpath)
# 刷新
sys.stdin.flush()
# 输出修改后文件夹中包含的文件名称
print("修改后:" + str(os.listdir(r"./neteasy_playlist_data3"))[1])
(6)文件批量移除、复制、筛选
下面是把sourceDir文件夹下的以.JPG结尾的文件全部复制到targetDir文件夹下:
(7)复制文件、复制文件夹
#复制文件:
shutil.copyfile("oldfile","newfile") #oldfile和newfile都只能是文件
shutil.copy("oldfile","newfile") #oldfile只能是文件夹,newfile可以是文件,也可以是目标目录
#复制文件夹:
shutil.copytree("olddir","newdir") #olddir和newdir都只能是目录,且newdir必须不存在
(8)文本内容的复制,把目录下的所有文件的内容都写入到目标文件中:
for file in os.listdir(sourceDir):
sourceFile = os.path.join(sourceDir, file)
targetFile = os.path.join(targetDir, file)
#cover the files //复写?
if os.path.isfile(sourceFile):
open(targetFile, "wb").write(open(sourceFile, "rb").read())
(9)将文件夹下所有图片名称加上'_fc'
思路当前文件分为文件和文件夹,文件夹下在递归
# -*- coding:utf-8 -*-
import re
import os
import time
#str.split(string)分割字符串
#'连接符'.join(list) 将列表组成字符串
def change_name(path):
global i
if not os.path.isdir(path) and not os.path.isfile(path):
return False
if os.path.isfile(path):
file_path = os.path.split(path) #分割出目录与文件
lists = file_path[1].split('.') #分割出文件与文件扩展名
file_ext = lists[-1] #取出后缀名(列表切片操作)
img_ext = ['bmp','jpeg','gif','psd','png','jpg']
if file_ext in img_ext:
os.rename(path,file_path[0]+'/'+lists[0]+'_fc.'+file_ext)
i+=1 #注意这里的i是一个陷阱
#或者
#img_ext = 'bmp|jpeg|gif|psd|png|jpg'
#if file_ext in img_ext:
# print('ok---'+file_ext)
elif os.path.isdir(path):
for x in os.listdir(path):
change_name(os.path.join(path,x))
#os.path.join()在路径处理上很有用
img_dir = 'D:\\xx\\xx\\images'
img_dir = img_dir.replace('\\','/')
start = time.time()
i = 0
change_name(img_dir)
c = time.time() - start
print('程序运行耗时:%0.2f'%(c))
print('总共处理了 %s 张图片'%(i))
6、创建文件夹
os.mkdir(path)
os.makedirs(path)
os.removedirs()#删除多级目录
def mkdir(path):
import os
path=path.strip()
path=path.rstrip("\\")
isExists=os.path.exists(path)
if not isExists:
# 如果目录不存在则创建该目录
os.makedirs(path)
return True
else:
# 如果目录存在则不创建,并提示目录已存在
print(path,'目录已存在')
return False
7、判断文件或者文件夹是否存在
import os
os.path.exists('d:/assist')
os.path.exists('d:/assist/getTeacherList.py')
os.path.isfile('d:/assist')
os.path.isfile('d:/assist/getTeacherList.py')
os.path.isdir(path)
os.makedirs('d:/assist/set')
os.path.exists('d:/assist/set')
8、文件打开方式
os.mknod("test.txt") 创建空文件
fp = open("test.txt",w) 直接打开一个文件,如果文件不存在则创建文件
关于open 模式:
w 以写方式打开,
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
a+ 以读写模式打开 (参见 a )
rb 以二进制读模式打开
wb 以二进制写模式打开 (参见 w )
ab 以二进制追加模式打开 (参见 a )
rb+ 以二进制读写模式打开 (参见 r+ )
wb+ 以二进制读写模式打开 (参见 w+ )
ab+ 以二进制读写模式打开 (参见 a+ )
fp.read([size]) #size为读取的长度,以byte为单位
fp.readline([size]) #读一行,如果定义了size,有可能返回的只是一行的一部分
fp.readlines([size]) #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
fp.write(str) #把str写到文件中,write()并不会在str后加上一个换行符
fp.writelines(seq) #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
fp.close() #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。 如果一个文件在关闭后还对其进行操作会产生ValueError
fp.flush() #把缓冲区的内容写入硬盘
fp.fileno() #返回一个长整型的”文件标签“
fp.isatty() #文件是否是一个终端设备文件(unix系统中的)
fp.tell() #返回文件操作标记的当前位置,以文件的开头为原点
fp.next() #返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
fp.seek(offset[,whence]) #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
fp.truncate([size]) #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
9、相关操作
python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。
得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()
返回指定目录下的所有文件和目录名:os.listdir()
函数用来删除一个文件:os.remove()
删除多个目录:os.removedirs(r“c:\python”)
检验给出的路径是否是一个文件:os.path.isfile()
检验给出的路径是否是一个目录:os.path.isdir()
判断是否是绝对路径:os.path.isabs()
检验给出的路径是否真地存:os.path.exists()
返回一个路径的目录名和文件名:os.path.split() eg os.path.split('/home/swaroop/byte/code/poem.txt') 结果:('/home/swaroop/byte/code', 'poem.txt')
分离扩展名:os.path.splitext()
获取路径名:os.path.dirname()
获取文件名:os.path.basename()
运行shell命令: os.system()
读取和设置环境变量:os.getenv() 与os.putenv()
给出当前平台使用的行终止符:os.linesep Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'
指示你正在使用的平台:os.name 对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'
重命名:os.rename(old, new)
创建多级目录:os.makedirs(r“c:\python\test”)
创建单个目录:os.mkdir(“test”)
获取文件属性:os.stat(file)
修改文件权限与时间戳:os.chmod(file)
终止当前进程:os.exit()
获取文件大小:os.path.getsize(filename)
10、
目录操作:
os.mkdir("file") 创建目录
复制文件:
shutil.copyfile("oldfile","newfile") oldfile和newfile都只能是文件
shutil.copy("oldfile","newfile") oldfile只能是文件夹,newfile可以是文件,也可以是目标目录
复制文件夹:
shutil.copytree("olddir","newdir") olddir和newdir都只能是目录,且newdir必须不存在
重命名文件(目录)
os.rename("oldname","newname") 文件或目录都是使用这条命令
移动文件(目录)
shutil.move("oldpos","newpos")
删除文件
os.remove("file")
删除目录
os.rmdir("dir")只能删除空目录
shutil.rmtree("dir") 空目录、有内容的目录都可以删
转换目录
os.chdir("path") 换路径
测试代码
import os.path
import shutil
def copyFiles(sourceDir,targetDir):
for files in os.listdir(sourceDir):
sourceFile = os.path.join(sourceDir,files) //把文件夹名和文件名称链接起来
targetFile = os.path.join(targetDir,files)
if os.path.isfile(sourceFile) and sourceFile.find('.JPG')>0: //要求是文件且后缀是jpg
shutil模块
复制整个目录
shutil.copytree(r"./file1",r"./file2")
# 拷贝整个目录到其他目录,不存在则创建
# 拷贝文件
#拷贝文件的时候,如果指定的文件目的位置之间有目录不存在,则会抛出错误。所以最好在拷贝之间确认目录存在。
os.mkdir("./file2")
shutil.copy(r"./file1/a.jpg",r"./file2/cc.jpg")
# 删除目录使用如下函数:
shutil.rmtree('d:/dd')
# 移动文件或者文件夹到另外一个地方:
shutil.move('d:/c.png','e:/')
#从help中可以看出来,copyfile仅仅是把文件拷贝到目的文件。但是copy函数可以把文件的mode也一# 起拷贝。比如说原来的文件有+x可执行权限,那么目的文件也会有可执行权限。
os.rmdir(path) # path是文件夹路径,注意文件夹需要时空的才能被删除
# 删除一级目录下的所有文件:
for file in os.listdir(targetDir):
targetFile = os.path.join(targetDir, file)
if os.path.isfile(targetFile): //只删除文件不删除文件夹
os.remove(targetFile)
# 文本内容的复制,把目录下的所有文件的内容都写入到目标文件中:
for file in os.listdir(sourceDir):
sourceFile = os.path.join(sourceDir, file)
targetFile = os.path.join(targetDir, file)
#cover the files //复写?
if os.path.isfile(sourceFile):
open(targetFile, "wb").write(open(sourceFile, "rb").read())
#复制文件:
shutil.copyfile("oldfile","newfile") #oldfile和newfile都只能是文件
shutil.copy("oldfile","newfile") #oldfile只能是文件夹,newfile可以是文件,也可以是目标目录
#复制文件夹:
shutil.copytree("olddir","newdir") #olddir和newdir都只能是目录,且newdir必须不存在
#重命名文件(目录)
os.rename("oldname","newname") #文件或目录都是使用这条命令
#移动文件(目录)
shutil.move("oldpos","newpos")
shutil.move("D:/知乎日报/latest/一张优惠券,换你的通讯录信息,你愿意吗?.pdf", "D:/知乎日报/past/")
import os
fileList = os.listdir(r"./")
# 输出此文件夹中包含的所有文件名称
print (fileList)
currentpath = os.getcwd()
# 得到进程当前工作目录
print (currentpath)
os.chdir(r"./")
# 将当前工作目录修改为待修改文件夹的位置
'''
import re
for fileName in fileList:
# 匹配文件名正则表达式
pat = ".+\.(json)"
# 进行匹配
pattern = re.findall(pat, fileName)
# 文件重新命名
os.rename(fileName, (str(num + 839) + '.' + pattern[0]))
# 改变编号,继续下一项
num = num + 1
'''
'''
for imagePath in imagePaths:
image = cv2.imread(imagePath)
image = cv2.resize(image, (28, 28))
image = img_to_array(image)
data.append(image)
label = imagePath.split(os.path.sep)[-2]
for i in range(num_class) :
if label == dir_labels[i] :
label = i
labels.append(label)
'''
# finding the labels
print("[INFO] Finding Labels...")
dir_labels = ()
# 路径元组
num_class = 0
for file in os.listdir(r"./images/train") :
temp_tuple=(file,'null')
dir_labels=dir_labels+temp_tuple
dir_labels=dir_labels[:-1]
num_class=num_class+1
print(dir_labels)
print(num_class)
data = []
labels = []
# imagePaths = os.listdir(r"./images/train")
# print (imagePaths) 路径下文件
from imutils import paths
imagePaths = sorted(list(paths.list_images(r"./images/train")))
# ./images/train\surprised\9985.jpg
print (imagePaths)
print (dir_labels)
for imagePath in imagePaths:
# print (imagePath )
label = imagePath.split(os.path.sep)[-2]
for i in range(num_class) :
if label == dir_labels[i] :
label = i
labels.append(i)
print (len(labels))
import pandas as pd
result = pd.value_counts(labels)
print("result:",result)
print ("#############")
# 遍历当前文件夹下的所有文件,文件夹
import os
path = r'H:\2020毕业前机器学习总结\测试代码\keras-resnet-master'
Filles = []
Dirs = []
for root,dirs,files in os.walk(path):
for file in files:
tmp = os.path.join(root,file)
# if tmp == "ss":
# Filles.append()
for dir in dirs:
Dirs.append(os.path.join(root,dir))
print (Filles)
print ("#############")
print (Dirs)
# 创建 移动文件夹
删除文件放到回收站
from win32com.shell import shell,shellcon
debug=False
def deltorecyclebin(filename):
print('deltorecyclebin', filename)
# os.remove(filename) #直接删除文件,不经过回收站
if not debug:
res= shell.SHFileOperation((0,shellcon.FO_DELETE,filename,None, shellcon.FOF_SILENT | shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION,None,None)) #删除文件到回收站
if not res[1]:
os.system('del '+filename)
import os
import shutil
path = r'H:\2020毕业前机器学习总结\测试代码\keras-resnet-master\images\Cohn-Kanade'
for root,dirs,files in os.walk(path):
# root H:\2020毕业前机器学习总结\测试代码\keras-resnet-master\images\Cohn-Kanade\7\S054
# file
# root文件夹下的文件内容(所有文件和所有文件夹)子问题,递归
num = 0
# 统计的是文件
last_file = ""
now_dir = ""
for file in files:
if num < 10:
tmp = os.path.join(root,file)
num += 1
# print (tmp)
#print (num, end = " ")
last_file = tmp
now_dir = os.path.join(root,file)
else:
tmp = os.path.join(root,file)
num += 1
last_file = tmp
# print (tmp)
#print (num, end = " ")
# tmp = os.path.join(root,file)
# os.remove(tmp) #直接删除文件,不经过回收站
if num == 10 or num == 0:
print (root)
print (num)
print("TRUE")
else:
print("False")
print(root)
print(num)
for i in range(1,11-num):
# 拷贝文件
# 拷贝文件的时候,如果指定的文件目的位置之间有目录不存在,则会抛出错误。所以最好在拷贝之间确认目录存在。
new_num = num + i
if new_num < 10:
print (last_file)
shutil.copy(last_file, root+"\S502_002_0000000"+str(new_num )+".png" )
else:
print(last_file)
shutil.copy(last_file, root+"\S502_002_000000"+str(new_num )+".png" )
import os
import shutil
path = r'H:\Paper_Code\datasets\Cohn-Kanade'
for root, dirs, files in os.walk(path):
# root 当前文件
# files 当前文件下的文件夹
# dirs 当前文件下的文件(所有文件和所有文件夹)
# # 子问题,递归
num = 0
# 统计的是文件
for file in files:
if str.endswith('.jpg'):
tmp = os.path.join(root, file)
print (tmp)
if num%10 != 0:
print (num)
print (root)