Python os.walk() 函数与查找命令
Python os.walk() function vs. find command
我正在编写一个程序来遍历文件系统以收集文件信息以放入数据库中。在 shell 编写脚本的一生之后,我正在尝试学习 python,并且发现 find returns 和 os.walk
returns[=16= 之间存在问题]
find THIS_PATH -print
for dirpath, dirs, files in os.walk( THIS_PATH ):
print ( root )
for fname in files:
print ( os.path.join( root, fname ) )
我遇到的问题是 "OS" find
returns 指向目录的符号链接,但 python 查找没有,我不知道如何制作它这样做。现在我不希望它跟随它们(即 followlinks=True
),这也会产生与 find 不同的结果。但我希望能够打印目录符号链接的条目。
谢谢
c
如果你想获得相同的输出(排序可能会有所不同),你需要打印给定路径的目录和文件。 find
returns 目录以及链接(指向任何内容)。对您的代码进行的最小更改为:
print(THIS_PATH)
for dirpath, dirs, files in os.walk(THIS_PATH):
for fname in dirs + files: # iterate over items form both lists
print (os.path.join(dirpath, fname))
用 pathlib
做起来可能更容易一些:
from pathlib import Path
mypath = Path(THIS_PATH)
for found_item in mypath.rglob('*'):
print(mypath.joinpath(found_item))
例如,我创建了以下树:
.
├── d1
│ ├── d2
│ │ └── f2
│ └── f1
├── f2 -> d1/d2/f2
└── l1 -> d1
运行 find
将产生(注意目录和目录链接的显示方式相同):
$ find .
.
./f2
./l1
./d1
./d1/.h
./d1/d2
./d1/d2/f2
./d1/f1
和 运行 带有 THIS_PATH='.'
的第一个片段产生相同的项目(顺序略有不同,find
将默认深度优先,os.walk
广度优先) .对于那个 pathlib
示例,请注意如果 THIS_PATH
是 '.'
,因为它会把前面的 ./
去掉。
我正在编写一个程序来遍历文件系统以收集文件信息以放入数据库中。在 shell 编写脚本的一生之后,我正在尝试学习 python,并且发现 find returns 和 os.walk
returns[=16= 之间存在问题]
find THIS_PATH -print
for dirpath, dirs, files in os.walk( THIS_PATH ):
print ( root )
for fname in files:
print ( os.path.join( root, fname ) )
我遇到的问题是 "OS" find
returns 指向目录的符号链接,但 python 查找没有,我不知道如何制作它这样做。现在我不希望它跟随它们(即 followlinks=True
),这也会产生与 find 不同的结果。但我希望能够打印目录符号链接的条目。
谢谢 c
如果你想获得相同的输出(排序可能会有所不同),你需要打印给定路径的目录和文件。 find
returns 目录以及链接(指向任何内容)。对您的代码进行的最小更改为:
print(THIS_PATH)
for dirpath, dirs, files in os.walk(THIS_PATH):
for fname in dirs + files: # iterate over items form both lists
print (os.path.join(dirpath, fname))
用 pathlib
做起来可能更容易一些:
from pathlib import Path
mypath = Path(THIS_PATH)
for found_item in mypath.rglob('*'):
print(mypath.joinpath(found_item))
例如,我创建了以下树:
.
├── d1
│ ├── d2
│ │ └── f2
│ └── f1
├── f2 -> d1/d2/f2
└── l1 -> d1
运行 find
将产生(注意目录和目录链接的显示方式相同):
$ find .
.
./f2
./l1
./d1
./d1/.h
./d1/d2
./d1/d2/f2
./d1/f1
和 运行 带有 THIS_PATH='.'
的第一个片段产生相同的项目(顺序略有不同,find
将默认深度优先,os.walk
广度优先) .对于那个 pathlib
示例,请注意如果 THIS_PATH
是 '.'
,因为它会把前面的 ./
去掉。