</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>
目录增删
-
import os
-
os.mkdir(path)
#创建
-
os.rmdir(path)
#删除一个空文件夹(目录),非空会报错
-
print(os.getcwd())
#打印当前工作所处目录
-
os.chdir(path)
#更改当前工作所处目录
引用文件
打开与代码在同一文件夹下(与代码同级)的文件:
-
#This code file is named "open_img.py"
-
from PIL
import Image
-
path =
'img.jpg'
-
img=Image.open(path)
-
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本身就用“/”表示)。然而如果将路径输出,可能会看到“\\”、“\”和“/”共存的情况,这个不影响,只要代码中使用“/”或“\\”即可。
获取当前文件的位置
-
import os
-
print(os.getcwd())
-
print(os.path.dirname(__file__))
-
print(os.path.realpath(__file__))
在某个文件(假设为a.py)输入以上代码,输出为:
-
C:\Users\Zerg Wang\Desktop
-
C:
/Users/Zerg Wang/Desktop
-
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,存有所有文件(不包括子目录),若要得到这些值,可以:
-
for root, dirs, files
in os.walk(folder):
-
for dir
in dirs:
-
print(dir)
#输出所有子目录名
-
for f
in files:
-
print(f)
#输出所有文件名
glob
Python自带的库,无需pip安装,功能类似于Windows中的搜索,其函数glob.glob(path)通过在path中插入通配符*或?起到搜索的功能,返回为一个列表,包含所有符合的结果路径。除了常用的glob.glob,还有glob.iglob,两者功能类似,后者返回迭代器。
以VOC数据集的路径为例:
-
import glob
-
-
for path
in glob.glob(
'VOCdevkit/*/*'):
-
print(path)
(此为部分截图,返回的路径格式与输入路径一致)
再介绍一下通配符,“*”用于匹配0到多个字符,例如*.jpg就是所有扩展名为jpg的文件,而“?”仅匹配一个字符,例如“VOC20??”输出为“VOC2007”和“VOC2012”,此外在匹配时还可以指定字符,例如[0-9]指定的就是单个数字字符。
如果输入的路径精确到某一文件,则输出该文件路径。
文件读写
正常读取及打印文件内容:
-
f = open(path,
'r')
-
print(f.read())
#f.readline() or f.readlines()
-
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'模式,可以先:
-
f = open(path,
'r+')
-
f.read()
把文件原有内容先读出,指针就会在文件末尾,从而进行内容的追加。
要知道当前指针位置,可用file.tell(),返回一个数字,表示指针前的字节数。
注意:’r+'和'w+'模式是有区别的,'w'和'w+'模式会先将文件原有内容覆盖。
图片来自菜鸟教程(http://www.runoob.com/python/python-files-io.html)
二进制形式读写:
在对应的模式下加上'b'即可,例如:
-
f1 = open(path,
'rb')
-
f2 = open(path,
'wb')
-
f3 = open(path,
'ab')
With...as读写方式
为防止文件读写过程中出错中止程序以至于f.close()未能执行,一般会使用try...finally保证文件被正常关闭:
-
try:
-
f = open(path,
'r')
-
print(f.read())
-
finally:
-
if f:
-
f.close()
当然,使用with...as会更加简洁:(虽然没写出来,但无论程序是否中断f.close仍会执行)
-
with open(path,
'r')
as f:
-
print(f.read())
删除与重命名
-
import os
-
os.rename(old_path, new_path)
-
os.remove(path)
复制与移动
-
import shutil
-
shutil.move(file_path, target_path)
#文件移动
-
shutil.copy(file_path, target_path)
#文件复制
目标路径target_path最后有没有“/”无所谓~
shutil.copyfile功能与shutil.copy相似,但使用前者可能会遇到权限问题,因此推荐后者。
前面的file_path也可以填写目录名,但shutil.copy复制目录可能会遇到权限问题……
Python包引用
同文件夹下的a.py要引用b.py:
-
#This code file is named "a.py"
-
from .
import b
导入Python包时的简写
import numpy as np, pandas
以上代码的意思不是numpy有两个别名,而是import了numpy和pandas,其中numpy的简写为np,可以:
import numpy as np, pandas as pd
字符串操作
获取文件名、拓展名、路径:
-
import os
-
-
st =
'1/2/3/4/5.jpg'
-
-
print(os.path.split(st))
# ('1/2/3/4', '5.jpg')
-
-
print(os.path.splitext(st))
# ('1/2/3/4/5', '.jpg')
os.path.split返回两个值,第一个为字符串st的路径,第二个为文件名。
os.path.splitext也返回两个值,第一个为文件名(无后缀名),第二个为后缀名(包括“.”)
可用索引指定第一个或第二个值,如:
-
filename = os.path.splitext(st)[
0]
-
extensionname = os.path.splitext(st)[
1]