实际上,我有一个文件夹(下图中的数据),其中包含2个子文件夹,并且每个子文件夹都包含一些.png文件。我需要遍历每个子文件夹并对该子文件夹中的每个图像文件进行一些编码,然后保存结果。我使用了os.walk()
和os.listdir()
和glob.glob()
,但是它们都没有起作用。我尝试过的许多代码之一与下面的代码相同:
path1 = Path('./data')
path2 = os.listdir(path1)
# loop through main folder to read each subfolder
for i in path2:
if not i.startswith('.'):
path3 = Path(os.path.join(path1,i))
path4 = os.listdir(path3)
#loop through each subfolder to read each file
for j in path4:
#some coding
任何建议将不胜感激。
答案 0 :(得分:1)
我建议使用pathlib
库。该库是一个“面向对象的文件系统路径”模块,结合了Python的最佳文件系统模块,例如os,os.path和glob。
from pathlib import Path
path1 = Path('./data')
files = [item.as_posix() for item in path1 .glob('**/*.png') if item.is_file()]
这将为您提供数据子文件夹中所有.png路径的列表。
答案 1 :(得分:0)
您可以像这样使用listdir()
:
# pathname of root dir
images_path = "./data"
# filtered file extension
suffix = ".png"
# For each image,
for i in os.listdir(images_path):
file = os.path.basename(i)
fileName, fileExtension = os.path.splitext(file)
# is it an image file with 'suffix' extension ?
if os.path.isfile(images_path+'/'+i) and fileExtension == suffix:
# do some coding
答案 2 :(得分:0)
os.walk
这样的事情:
import os
for root, dirs, files in os.walk(path_to_data_folder):
# if not root.endswith(good_folder_name):
# continue
for fname in files:
if fname_meets_my_criteria:
fpath = os.path.join(root, fname)
with open(fpath, 'r') as f, open(new_file_path, 'w') as newfile:
data = f.read()
# process file data
new_data = func_that_processes_data(data)
newfile.write(new_data)
其中包含一些伪代码:
fname_meets_my_criteria
代替了比较,如果您要过滤文件以进行处理,则需要使用它-可能类似于fname.edswith('.txt')
或not fname.endswith('.cfg')
new_file_path
是处理后的数据将写入的新文件的路径和名称。
如果您打算在处理完文件后覆盖文件,请改用以下方法:
for root, dirs, files in os.walk(path_to_data_folder):
# if not root.endswith(good_folder_name):
# continue
for fname in files:
if fname_meets_my_criteria:
fpath = os.path.join(root, fname)
with open(fpath, 'r') as f:
data = f.read()
# process file data
new_data = func_that_processes_data(data)
with open(fpath, 'w') as f:
f.write(new_data)
在我的两个示例中,文件都以文本文件形式打开。如果您需要处理字节而不是测试/字符串,请使用mode
arguments of 'rb'
or 'wb'
答案 3 :(得分:0)
我可以找到答案!这很简单,但是我在命名时犯了一个错误。因此,下面编写的代码可能会帮助遇到相同问题的其他人:
path = "./data/"
for subfolder in os.listdir(path):
subfolder_name = path + subfolder
for imgs in os.listdir(subfolder_name):
imagename = subfolder_name + '/' + imgs
# do some coding