Python实现文件的操作

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)



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值