os.path 和 os.join 的正确用法

9 投票
3 回答
14196 浏览
提问于 2025-04-17 17:54

我正在尝试写一个处理文件的程序,这些文件分布在不同的子文件夹里。不过,虽然我的脚本能“看到”这些文件,但却无法对它们进行任何操作,因为它无法正确拼接出这些文件的路径。

问题出在这个循环上:

for (path, dirs, files) in os.walk("data/"):
    for image in files: 
        #do something to the image

现在,这个脚本在data目录的第一层工作得很好,但在data的子目录里就不行了。

我试着使用os.path.join()来解决这个问题:

for (path, dirs, files) in os.walk("data/"):
    print os.path.join(path, dirs)

但是这会抛出以下错误:

Traceback (most recent call last):
  File "bench.py", line 26, in <module>
    print os.path.join(path, dirs)
  File "/usr/lib/python2.7/posixpath.py", line 75, in join
    if b.startswith('/'):
AttributeError: 'list' object has no attribute 'startswith'

简单来说,我想做的是从data拼接出一个路径,这个路径要包含data的子目录里的图片。请问有什么好的方法可以做到这一点呢?

3 个回答

1

这段代码的意思是……

首先,它会做一些准备工作,比如设置一些变量或者加载需要的资源。接着,它会进入一个循环,这个循环会重复执行一些操作,直到满足特定条件为止。最后,当条件满足后,它会跳出循环,继续执行后面的代码。

在这个过程中,可能会有一些判断,比如检查某个值是否符合要求,如果不符合,就会执行不同的操作。这种方式让程序能够根据不同的情况做出不同的反应。

总的来说,这段代码的结构就是先准备、再循环处理、最后根据条件做出决策。这样可以让程序更加灵活和高效。

for (path, dirs, files) in os.walk("data/"):
  for image in files: 
    file_path = os.path.join(path, image)
    # do your stuff
2

试试这个:

for (path, dirs, files) in os.walk("data/"):
  for image in files: 
    fname = os.path.join(path, image)
    file = open(fname, 'rb')

os.walk 的文档中,有两个例子正好展示了这个功能。

10

我觉得你想要把每个files里的filepath连接起来。

for path,dirs,files in os.walk('data/'):
    for f in files:
        fname = os.path.join(path,f)
        assert(os.path.exists(fname))

dirs是一个包含在path目录下的文件夹列表。你实际上可以直接修改dirs,这样可以防止os.walk进入某些特定的文件夹(这很酷!)。

撰写回答