小镇的夕阳|知道了这些,您可以使用Python超过99%的文件操作( 四 )

os
os模块具有一个system()函数 , 允许您在子shell中执行命令 。您需要将该命令作为参数传递给system() 。这与在操作系统上执行的命令具有相同的效果 。为了移动和删除文件 , 您还可以在os模块中使用专用功能 。
# copyos.system("cp 1.csv copy.csv")# rename/moveos.system("mv 1.csv move.csv")os.rename("1.csv", "move.csv")# deleteos.system("rm move.csv")异步复制/移动文件
到目前为止 , 解决方案始终是同步的 , 这意味着如果文件很大并且需要更多时间移动 , 则程序可能会被阻止 。如果要使程序异步 , 则可以使用threading , multiprocessing或subprocess模块使文件操作在单独的线程或单独的进程中运行 。
import threadingimport subprocessimport multiprocessingsrc = "http://kandian.youth.cn/index/1.csv"dst = "dst_thread.csv"thread = threading.Thread(target=shutil.copy, args=[src, dst])thread.start()thread.join()dst = "dst_multiprocessing.csv"process = multiprocessing.Process(target=shutil.copy, args=[src, dst])process.start()process.join()cmd = "cp 1.csv dst_subprocess.csv"status = subprocess.call(cmd, shell=True)搜索文件复制和移动文件后 , 您可能需要搜索与特定模式匹配的文件名 。Python提供了许多内置函数供您选择 。
glob
glob模块根据Unix shell使用的规则查找与指定模式匹配的所有路径名 。它支持通配符 , 例如*? 。[] 。
glob.glob(“ * 。 csv”)搜索当前目录中所有具有csv扩展名的文件 。使用glob模块 , 还可以在子目录中搜索文件 。
>>> import glob>>> glob.glob("*.csv")['1.csv', '2.csv']>>> glob.glob("**/*.csv",recursive=True)['1.csv', '2.csv', 'source/3.csv']os
os模块是如此强大 , 以至于它基本上可以执行文件操作 。我们可以简单地使用os.listdir()列出目录中的所有文件 , 并使用file.endswith()和file.startswith()来检测模式 。如果要遍历目录 , 请使用os.walk() 。
import osfor file in os.listdir("."):if file.endswith(".csv"):print(file) for root, dirs, files in os.walk("."):for file in files:if file.endswith(".csv"):print(file)pathlib
pathlib具有与glob模块类似的功能 。也可以递归搜索文件名 。与以前的基于os的解决方案相比 , pathlib具有更少的代码 , 并且提供了更多的面向对象的解决方案 。
播放文件路径使用文件路径是我们执行的另一项常见任务 。它可以获取文件的相对路径和绝对路径 。它也可以连接多个路径并找到父目录等 。
相对路径和绝对路径
os和pathlib都提供了获取文件或目录的相对路径和绝对路径的功能 。
import osimport pathlibprint(os.path.abspath("1.txt"))# absoluteprint(os.path.relpath("1.txt"))# relativeprint(pathlib.Path("1.txt").absolute())# absoluteprint(pathlib.Path("1.txt"))# relative联接路径
这是我们可以独立于环境连接os和pathlib中的路径的方式 。pathlib使用斜杠创建子路径 。
import osimport pathlibprint(os.path.join("/home", "file.txt"))print(pathlib.Path("/home") / "file.txt")获取父目录
dirname()是在os中获取父目录的函数 , 而在pathlib中 , 您可以仅使用Path() 。 parent来获取父文件夹 。
import osimport pathlib# relative pathprint(os.path.dirname("source/2.csv"))# sourceprint(pathlib.Path("source/2.csv").parent)# source# absolute pathprint(pathlib.Path("source/2.csv").resolve().parent)# /Users/


推荐阅读