目录
1.遍历目录 os.walk()
import os
for root, dirs, files in os.walk(path):
for name in files:
print(os.path.join(root, name))
for name in dirs:
print(os.path.join(root, name))
2.随机打乱列表:random
import random
random.seed(666)
random.shuffle(imgs_list)
3. glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合。
import glob
for name in glob.glob('dir/*.png'):
print (name)
##or
imgs_list = glob.glob(os.path.join(root, sDir)+'/*.png')
4.文件夹不存在就创建 makedirs
#os.makedirs会递归的建立输入的路径,即使是上层的路径不存在,它也会建立这个路径,而os.mkdir父级路径不存在,那么就会报错
def makedir(new_dir):
if not os.path.exists(new_dir):
os.makedirs(new_dir)
5.os.path.split()与os.path.splitext()
os.path.split()返回文件的路径和文件名
os.path.splitext()将文件名和扩展名分开
fname,fename=os.path.split("/media/data_2/Data/cat.png")
#fname = “/media/data_2/Data”
#fename=“cat.png”
fname,fename=os.path.splitext("("/media/data_2/Data/cat.png")")
#fname = “/media/data_2/Data/cat”
#fename=“.png”
for root, dirs, files in os.walk(dataset_dir):
for sDir in dirs:
imgs_list = glob.glob(os.path.join(root, sDir)+'/*.png')
random.seed(666)
random.shuffle(imgs_list)
imgs_num = len(imgs_list)
train_point = int(imgs_num * train_per)
valid_point = int(imgs_num * (train_per + valid_per))
for i in range(imgs_num):
if i < train_point:
out_dir = train_dir + sDir + '/'
elif i < valid_point:
out_dir = valid_dir + sDir + '/'
else:
out_dir = test_dir + sDir + '/'
makedir(out_dir)
out_path = out_dir + os.path.split(imgs_list[i])[-1]
shutil.copy(imgs_list[i], out_path)
6.创建图像
B_img = np.zeros(mask.shape, np.uint8)
img = np.zeros(img.shape[0:2], dtype='uint8')
7. 掩膜mask cv2.merge cv2.addWeighted R_img[mask == i] = r
img 是原图
mask 是原图上面对于的字条掩膜,每个字条像素是1,2,3累加计数的,其他区域像素为0
for i in range(bboxes.shape[0]):
cv2.drawContours(gt_text, [bboxes[i]], -1, i + 1, -1)
这样得到mask的
下面函数是要把原图上面显示掩膜。
用到了 R_img[mask == i] ; mask==i表示mask中像素值为i的坐标,加上 R_img[mask == i]表示R_img中相应的位置
def draw_mask(mask, img):
import random
# mask = cv2.imread(mask_dir + item)
# b, g, r = cv2.split(mask)
if type(mask) == type(None):
return mask
#if mask.shape[2] > 1:
# mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
R_img, G_img, B_img = np.zeros(mask.shape, np.uint8), np.zeros(mask.shape, np.uint8), np.zeros(mask.shape, np.uint8)
label_num = np.max(mask) + 1
# print(label_num)
for i in range(1, label_num):
r = random.random()*255
g = random.random()*255
b = random.random()*255
R_img[mask == i] = r
G_img[mask == i] = g
B_img[mask == i] = b
check = cv2.merge([R_img, G_img, B_img])
dst=cv2.addWeighted(img,0.7,check,0.3,0)
return dst
8.读写文本
一个文件夹下面的文本,img_1.txt,...,img_10000.txt,每个文本里面的内容格式都是像下面的,需要把###换成LOVE
48,323,798,320,795,370,48,375,###
43,42,890,30,890,90,44,102,###
503,207,899,203,900,265,503,269,###
46,209,349,209,349,268,46,268,###
38,272,454,272,454,319,38,319,###
713,516,839,516,839,573,713,573,###
import os
root = "/media/data_1/2019_project_test/PSENet/data/ICDAR2015/Challenge4/ch4_training_localization_transcription_gt/"
save_path = "/media/data_1/2019_project_test/PSENet/data/ICDAR2015/Challenge4/save/"
file_list = os.listdir(root)
cnt = 0
for file_name in file_list:
path_file = root + file_name
cnt += 1
print("cnt=%d,name=%s"%(cnt,file_name))
with open(save_path + file_name,'w') as fw:
with open(path_file, 'r') as fread:
for line in fread.readlines():
line = line.replace("###","LOVE")
fw.write(line)
总结:以后读文本就用这个:
with open(path_file, 'r') as fread:
for line in fread.readlines():
line = line.strip()
...
9.python list 自定义排序例子
eg1:
In [53]: L = [('b',6),('a',1),('c',3),('d',4)]
In [54]: L.sort(key=lambda x:x[1])
In [56]: L
Out[56]: [('a', 1), ('c', 3), ('d', 4), ('b', 6)]
eg2:班级学生的成绩信息集合:字段包括学号,姓名,语文成绩,数学成绩
item=[[101,'张三',80,75],[102,'李四',80,85],[103,'王五',63,90],[104,'小明',95,75],[105,'小红',75,65]]
这就是一种列表中嵌套列表的方法,假如我们要对语文成绩进行排序:
item=[[101,'张三',80,75],[102,'李四',80,85],[103,'王五',63,90],[104,'小明',95,75],[105,'小红',75,65]]
item.sort(key=lambda x:x[2], reverse=True)
print(item)
#[[104, '小明', 95, 75], [101, '张三', 80, 75], [102, '李四', 80, 85], [105, '小红', 75, 65], [103, '王五', 63, 90]]
如果语文成绩相同则按数学成绩的高低排序:
item=[[101,'张三',80,75],[102,'李四',80,85],[103,'王五',63,90],[104,'小明',95,75],[105,'小红',75,65]]
item.sort(key=lambda x:(x[2],x[3]), reverse=True)
print(item)
#可以看到张三和李四的位置互换了
#[[104, '小明', 95, 75], [102, '李四', 80, 85], [101, '张三', 80, 75], [105, '小红', 75, 65], [103, '王五', 63, 90]]
那如果语文成绩和数学成绩都相同,则按学号升序排:
就可以这样做(在学号字段前面加个‘-’号):
item=[[101,'张三',80,75],[102,'李四',80,85],[103,'王五',63,90],[104,'小明',95,75],[105,'小红',75,65]]
item.sort(key=lambda x:(x[2],x[3],-x[0]), reverse=True)
print(item)
#[[104, '小明', 95, 75], [102, '李四', 80, 85], [101, '张三', 80, 75], [105, '小红', 75, 65], [103, '王五', 63, 90]]