Python下OS操作(路径、读写、引用、字符串操作)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Zerg_Wang/article/details/101557027
            </div>
                                                <!--一个博主专栏付费入口-->
         
         <!--一个博主专栏付费入口结束-->
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
                                    <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
            <div class="htmledit_views" id="content_views">
                                        <h1><a name="t0"></a>路径问题</h1>

目录增删


 
 
  1. import os
  2. os.mkdir(path) #创建
  3. os.rmdir(path) #删除一个空文件夹(目录),非空会报错
  4. print(os.getcwd()) #打印当前工作所处目录
  5. os.chdir(path) #更改当前工作所处目录

引用文件

打开与代码在同一文件夹下(与代码同级)的文件:


 
 
  1. #This code file is named "open_img.py"
  2. from PIL import Image
  3. path = 'img.jpg'
  4. img=Image.open(path)
  5. img.show()

也可以写成:

path = './img.jpg'
 
 

./表示当前目录,一般可省略不写

打开代码同级文件夹下的文件:

path = 'a/img.jpg'
 
 

同理,也可以写成:

path = './a/img.jpg'
 
 

若文件夹a中还有多级文件夹,继续加“/”深化路径即可。

打开代码文件上级文件夹中的文件:

path = '../img.jpg'
 
 

../表示上级目录,若img.jig还在更上层,可以继续叠加../

以上可以综合运用,例如a、b文件夹同级,代码在a中,图片在b中:

path = '../b/img.jpg'
 
 

若图片在硬盘根目录:

path = '/img.jpg'
 
 

图片绝对路径为:C:/img.jpg

以上写法均为相对路径写法,Python同样支持写绝对路径。

注意:在Windows中,文件的从属关系用“\”表示,然而在Python中该符号为转义符号,因此在表示路径时用“/”或“\\”表示。(非Windows系统如Linux本身就用“/”表示)。然而如果将路径输出,可能会看到“\\”、“\”和“/”共存的情况,这个不影响,只要代码中使用“/”或“\\”即可。

获取当前文件的位置


 
 
  1. import os
  2. print(os.getcwd())
  3. print(os.path.dirname(__file__))
  4. print(os.path.realpath(__file__))

在某个文件(假设为a.py)输入以上代码,输出为:


 
 
  1. C:\Users\Zerg Wang\Desktop
  2. C: /Users/Zerg Wang/Desktop
  3. C:\Users\Zerg Wang\Desktop\a.py

可以看到同样的路径相同,不同函数分别以“\”和“/”区分,这个无影响。

获取文件夹下所有文件名

os.listdir(dir_path)
 
 

返回一个list,由文件夹下所有文件和文件夹的名字(仅文件名,无路径)构成。遍历的深度仅为1,也就是说,如果其内部文件夹中还有文件,这些文件不会被遍历到。

如果要遍历包括所有子文件夹中的内容(深度不限),则使用os.walk(dir_path),返回三个值:root,dirs,files,其中root为根目录地址,dirs为list,存有所有子目录,files也为list,存有所有文件(不包括子目录),若要得到这些值,可以:


 
 
  1. for root, dirs, files in os.walk(folder):
  2. for dir in dirs:
  3. print(dir) #输出所有子目录名
  4. for f in files:
  5. print(f) #输出所有文件名

 

glob

Python自带的库,无需pip安装,功能类似于Windows中的搜索,其函数glob.glob(path)通过在path中插入通配符*或?起到搜索的功能,返回为一个列表,包含所有符合的结果路径。除了常用的glob.glob,还有glob.iglob,两者功能类似,后者返回迭代器。

以VOC数据集的路径为例:


 
 
  1. import glob
  2. for path in glob.glob( 'VOCdevkit/*/*'):
  3. print(path)

(此为部分截图,返回的路径格式与输入路径一致)

再介绍一下通配符,“*”用于匹配0到多个字符,例如*.jpg就是所有扩展名为jpg的文件,而“?”仅匹配一个字符,例如“VOC20??”输出为“VOC2007”和“VOC2012”,此外在匹配时还可以指定字符,例如[0-9]指定的就是单个数字字符。

如果输入的路径精确到某一文件,则输出该文件路径。

 

文件读写

正常读取及打印文件内容:


 
 
  1. f = open(path, 'r')
  2. print(f.read()) #f.readline() or f.readlines()
  3. f.close() #一般要在最后关闭文件的读写,防止其持续占用计算机资源。

'r'表示文件为只读模式。

f.read():一次性读取文件全部内容。

f.readline():每次读取文件中的一行。

f.readlines():同样是读取全部内容,但以list形式返回。

以上方法可接参数,表示每次读取的字节数,因此以上方法可迭代使用。

文件写入:

f = open(path,'w')    #若文件不存在会自动创建

 
 

如果写入方式是在文件末尾追加内容,则为:

f = open(path,'a')    #若文件不存在会自动创建

 
 

使用f.write('context...')即可向文件内写入内容。
如果要使文件可在程序中既能被读也能被写:模式可以设置为'r+'、'w+'、'a+‘。

文件读写的进度靠一个指针控制,读取共用,也就是说,要实现'a'模式,可以先:


 
 
  1. f = open(path, 'r+')
  2. f.read()

把文件原有内容先读出,指针就会在文件末尾,从而进行内容的追加。

要知道当前指针位置,可用file.tell(),返回一个数字,表示指针前的字节数。

注意:’r+'和'w+'模式是有区别的,'w'和'w+'模式会先将文件原有内容覆盖。

图片来自菜鸟教程(http://www.runoob.com/python/python-files-io.html

二进制形式读写:

在对应的模式下加上'b'即可,例如:


 
 
  1. f1 = open(path, 'rb')
  2. f2 = open(path, 'wb')
  3. f3 = open(path, 'ab')

With...as读写方式

为防止文件读写过程中出错中止程序以至于f.close()未能执行,一般会使用try...finally保证文件被正常关闭:


 
 
  1. try:
  2. f = open(path, 'r')
  3. print(f.read())
  4. finally:
  5. if f:
  6. f.close()

当然,使用with...as会更加简洁:(虽然没写出来,但无论程序是否中断f.close仍会执行)


 
 
  1. with open(path, 'r') as f:
  2. print(f.read())

删除与重命名


 
 
  1. import os
  2. os.rename(old_path, new_path)
  3. os.remove(path)

复制与移动


 
 
  1. import shutil
  2. shutil.move(file_path, target_path) #文件移动
  3. shutil.copy(file_path, target_path) #文件复制

目标路径target_path最后有没有“/”无所谓~

shutil.copyfile功能与shutil.copy相似,但使用前者可能会遇到权限问题,因此推荐后者。

前面的file_path也可以填写目录名,但shutil.copy复制目录可能会遇到权限问题……

 

Python包引用

同文件夹下的a.py要引用b.py:


 
 
  1. #This code file is named "a.py"
  2. from . import b

导入Python包时的简写

import numpy as np, pandas
 
 

以上代码的意思不是numpy有两个别名,而是import了numpy和pandas,其中numpy的简写为np,可以:

import numpy as np, pandas as pd

 
 

 

字符串操作

获取文件名、拓展名、路径:


 
 
  1. import os
  2. st = '1/2/3/4/5.jpg'
  3. print(os.path.split(st)) # ('1/2/3/4', '5.jpg')
  4. print(os.path.splitext(st)) # ('1/2/3/4/5', '.jpg')

os.path.split返回两个值,第一个为字符串st的路径,第二个为文件名。

os.path.splitext也返回两个值,第一个为文件名(无后缀名),第二个为后缀名(包括“.”)

可用索引指定第一个或第二个值,如:


 
 
  1. filename = os.path.splitext(st)[ 0]
  2. extensionname = os.path.splitext(st)[ 1]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值