关于python:Python10文件读写中

1次阅读

共计 6300 个字符,预计需要花费 16 分钟才能阅读完成。

引言

这篇文章介绍如何应用 python 的 os 与 shutil 模块,对文件或文件夹进行读写、创立、删除等操作。

文章目录

0×2. 文件夹相干操作
a. 拼接门路
b. 获取子目录名
c. 规范化门路输入
d. 判断目录或文件是否存在
e. 列出目录下所有文件
f. 创立删除文件夹
g. 通配符的应用
h. 文件和文件夹重命名
i. 文件夹复制

0×2. 文件夹相干操作

a. 拼接门路

os.path.join()函数用于拼接门路,它不会判断两个门路是否存在,仅仅实现将后面的门路和前面的门路进行拼接的性能,请看上面的实例:

#!/usr/bin/env python
#coding=utf-8
import os
path1="/www"
path2="qingsword/com"
print(os.path.join(path1,path2))

#输入
/www/qingsword/com

b. 获取子目录名

有时候咱们可能须要获取某个门路下最初一个子目录的名称,python 提供了一个 os.path.split()办法用于切割门路,请看上面的实例:

#!/usr/bin/env python
#coding=utf-8
import os
path1="/www/qingsword/com"
#split()办法返回一个元组,蕴含两个元素,父门路和子目录名
print(os.path.split(path1))
#能够间接应用两个对象来接管元组中这两个元素
p1,p2=os.path.split(path1)
print(p1)
print(p2)

#输入
('/www/qingsword', 'com')
/www/qingsword
com

如果想递归获取门路中每一层目录的名称,能够应用上面的办法:

#!/usr/bin/env python
#coding=utf-8
import os
#------
def split_fully(path):
    """递归获取门路中每一层目录的名称,返回一个元组"""
    parent_path,dir_name=os.path.split(path)
    if dir_name=="":
        return (parent_path,)
    else:
        return split_fully(parent_path)+(dir_name,)

path1="/www/qingsword/com"
for p in split_fully(path1):
    print(p)

#输入
/
www
qingsword
com

在下面这个实例中,程序的运行流程是这样的,split_fully()函数首先将 ”/www/qingsword/com” 门路宰割成 ”/www/qingsword” 与 ”com”,因为 dir_name 不为空,所以执行 return split_fully(parent_path)+(dir_name,),这一句中 (dir_name,) 就相当于 (com,) 而前半段应用父门路再次调用函数自身,外层函数将被挂起期待 split_fully(parent_path)后果的返回,这一次的调用 parent_path=”/www/qingsword”;

第一次调用本身 ”/www/qingsword” 被宰割成 ”/www” 和 ”qingsword”,因为 dir_name 不为空,函数第二次调用本身,此时如果咱们将所有变量都代入数据,返回最外层被挂起的函数查看 return,应该是这样的构造 return split_fully(“/www”)+(qingsword,)+(com,);

第二次调用本身,”/www” 被宰割成 parent_path=”/”,dir_name=”www” 不为空,程序会第三次调用本身,这一次 parent_path,dir_name=os.path.split(path)宰割后,dir_name 为空,所以返回 parent_path=”/”,最初一层一层返回,最外层的构造就变成了 return (“/”,)+(“www”,)+(“qingsword”,)+(“com”,), 只须要遍历这个元组,就能失去每个元素的值。

c. 规范化门路输入

在门路中,”.” 示意当前目录,”..” 示意父目录,如果咱们不心愿这些符号呈现,能够应用 os.path.normpath()函数,它不仅能够标准门路,将两个点主动解析成父目录,还能去除门路中多余的斜杠,请看上面的实例:

#!/usr/bin/env python
#coding=utf-8
import os
path1="///www/./qingsword////hidden/..//com"
print(os.path.normpath(path1))

#normpath 会主动革除目录中多余的斜杠,并且将.. 解析为父目录,所以 hidden 目录前面的.. 就相当于在 hidden 目录外面执行了一个 "cd .." 命令,返回了 qingsword 目录中,而 www 目录前面的. 就代表当前目录,所以间接去掉了,最初输入如下
/www/qingsword/com

d. 判断目录或文件是否存在

os.path.exists()函数可能判断指标是否存在,但不能判断指标是文件还是目录,请看上面的实例:

#!/usr/bin/env python
#coding=utf-8
import os
path1="/www/qingsword/com"
print(os.path.exists(path1))
print(os.path.exists("textfile"))

#输入,如果指标存在就返回 True,不存在就返回 False
TRUE
FALSE

e. 列出目录下所有文件

应用 os.listdir()函数,能够返回目标目录下所有文件夹和文件的名称列表,请看上面的实例:

#!/usr/bin/env python
#coding=utf-8
import os
#获取以后脚本所在目录的绝对路径
file_path=os.path.abspath(".")

#遍历列表,打印出每个文件或文件夹的名称
for name in os.listdir(file_path):
    print(name)

#如果想打印出目录下每个文件或文件夹的残缺门路,能够批改 print 函数,上面两种办法成果雷同
print(file_path+"/"+name)
print(os.path.join(file_path,name))

如果想要对 listdir 的输入进行排序,能够应用 sorted()函数,默认依照字母顺序排列,并且辨别大小写,大写字母 > 符号 > 小写字母,这样 for 中的 name 会依照排序后的程序读取并拼接:

#!/usr/bin/env python
#coding=utf-8
import os
file_path=os.path.abspath(".")
#排序输入
for name in sorted(os.listdir(file_path)):
    print(os.path.join(file_path,name))

下面的实例仅仅可能遍历某个目录下的文件和目录,但不能进行递归查问,也就是说,这个目录下的子目录中的文件是无奈被搜寻到的,上面提供一种遍历子目录文件的办法:

#!/usr/bin/env python
#coding=utf-8
import os
#------
def print_tree(path):
    """递归目录"""
    if os.path.isdir(path):
        #遍历目录,打印绝对路径
        for name in os.listdir(path):
            abs_path=os.path.join(path,name)
            print(abs_path)
            #如果门路为目录,调用本身,打印子目录内容
            if os.path.isdir(abs_path):
                print_tree(abs_path)

print_tree("/home/qing/test")

再来看一个实例,读取目录下的文件,显示每个文件的绝对路径,大小和最初批改工夫:

#!/usr/bin/env python
#coding=utf-8
import os
import time
#------
def list_dir(path):
    """打印目录中文件或文件夹的大小,最初批改工夫和绝对路径"""
    if os.path.isdir(path):
        for name in os.listdir(path):
            abs_path=os.path.join(path,name)
            sz=os.path.getsize(abs_path)
            modify_time=time.ctime(os.path.getmtime(abs_path))
            print("Size:%-8d Last Modify Time:%-25s Path:%s"%(sz,modify_time,abs_path))

list_dir("/home/qing/test")

利用列表生成式能够很简洁的打印出某一类型的文件列表,例如:

#!/usr/bin/env python3
#coding=utf-8
import os
#列出脚本所在文件夹中所有文件和文件夹名称
print([x for x in os.listdir(os.path.abspath("."))])

#列出脚本所在文件夹中所有子文件夹名称
print([x for x in os.listdir(os.path.abspath("."))\
       if os.path.isdir(x)])

#列出脚本所在文件夹中所有 py 文件名称
print([x for x in os.listdir(os.path.abspath("."))\
       if os.path.isfile(x) and os.path.splitext(x)[1]==".py"])

f. 创立删除文件夹

创立文件夹:

#!/usr/bin/env python
#coding=utf-8
import os
#os.mkdir()函数一次只能创立一个文件夹
if not os.path.exists("qingsword"):
    os.mkdir("qingsword")
#os.makedirs()函数可能一次性递归创立多个文件夹
if os.path.isdir("qingsword"):
    os.makedirs("qingsword/1/2/3/4")

Ps:在创立文件夹的过程中,如果指标存在,则会抛出一个 ”FileExistsError” 异样。

删除文件夹:

#!/usr/bin/env python
#coding=utf-8
import os
import shutil

if os.path.isdir("qingsword"):
    os.rmdir("qingsword/1/2/3/4")
    shutil.rmtree("qingsword")

Ps:os.rmdir()函数只能删除单个文件夹且文件夹下必须为空,否则会抛出一个 ”OSError” 异样,而 shutil 模块的 rmtree 办法可能一次性删除目录及上面的所有文件。

g. 通配符的应用

在 python 门路操作中,有上面这些比拟罕用的通配符:

  • 匹配多个字符;

? 匹配单个字符;

[…] 匹配括号中的单个字符,能够指定多个字符或字符范畴,例如:[ABCD]代表 ABCD 任意一个都能匹配;[a-z]匹配小写字母表中任意一个字符;[0-9]匹配 0 - 9 数字中的任意一个;

[!…]不匹配括号中指定的任意一个或某个范畴中的一个;

在 python 中有一个通配符模块 glob,这个模块的 glob()函数同 os.listdir()相似,都能返回某个目录下的文件,但 glob.glob()函数更加弱小,它可能配合通配符返回指定的文件类型,请看上面的实例:

#!/usr/bin/env python
#coding=utf-8
import os
import glob
path1="/home/qing/test"
if os.path.isdir(path1):
    #返回 path1 目录下所有 py 后缀的文件
    print(glob.glob(os.path.join(path1,"*.py")))
    #返回文件名最初一个字符在 a - d 范畴内的 py 文件
    print(glob.glob(os.path.join(path1,"*[a-d].py")))
    #返回文件名为四个字符的 py 文件
    print(glob.glob(os.path.join(path1,"????.py")))
    返回文件名为三个字符且最初一个字符不在 b - f 范畴内的 py 文件
    print(glob.glob(os.path.join(path1,"??[!b-f].py")))
    #这是 glob 函数弱小的中央,递归 path1 目录,返回目录以及子目录中所有 py 文件
    print(glob.glob(os.path.join(path1,"*/*.py")))

Ps:glob.glob()函数返回类型为列表。

h. 文件和文件夹重命名

os 模块的 rename 办法能够实现文件和文件夹重命名的操作,请看上面的实例:

#!/usr/bin/env python3
#coding=utf-8
import os
#如果 file1 存在且 file2 不存在,将 file1 改名为 file2,file1 能够是文件或文件夹的相对或相对路径
if os.path.exists("file1") and not os.path.exists("file2"):
    os.rename("file1","file2")

i. 文件夹复制

能够应用 shutil 模块的 copytree 办法来拷贝一个目录到指标地位,例如:

#!/usr/bin/env python3
#coding=utf-8
import os
import shutil
def copyDir(src,dst):
    """实现源文件夹到指标地位的复制"""
    if os.path.isdir(src) and not os.path.exists(dst):
        shutil.copytree(src,dst)
        print("复制胜利。")
    else:
        print("复制失败。")
def moveDir(src,dst):
    """实现源文件夹到指标地位的挪动"""
    if os.path.isdir(src) and not os.path.exists(dst):
        shutil.copytree(src,dst)
        shutil.rmtree(src)
        print("挪动胜利。")
    else:
        print("挪动失败。")   

moveDir("dir1","dir2")
copyDir("dir1","dir2")
正文完
 0