为了便于组织,我希望文件中包含我放置文件夹的子文件夹的名称。但是,我不确定如何使用os.walk()访问子文件夹的名称
为简洁起见,假设我在两个子文件夹中有一个文件夹:
['Patch Dock 6HUO Entire ECD GABA', 'Patch Dock 6HUP TMD Diazepam']
在每个子文件夹中都会有同名的文件:
[ 'docking.res.10.pdb', 'docking.res.11.pdb', 'docking.res.12.pdb' ]
我想要的输出将位于每个子文件夹中,文件将命名为:
[ 'Patch Dock 6HUO Entire ECD GABA docking.res.10.pdb', 'Patch Dock 6HUO Entire ECD GABA docking.res.11.pdb', 'Patch Dock 6HUO Entire ECD GABA docking.res.12.pdb' ]
[ 'Patch Dock 6HUP TMD Diazepam docking.res.10.pdb', 'Patch Dock 6HUP TMD Diazepam docking.res.11.pdb', 'Patch Dock 6HUP TMD Diazepam docking.res.12.pdb' ]这是我到目前为止已经尝试过的方法,但我不确定在使用嵌套的for循环时如何访问文件名和子文件夹的名称,如os.walk()所要求的那样。
os.chdir(pathway)
pathway_tree = os.walk(pathway)
try:
#
for subdir, dirs, files_in_dirs in pathway_tree:
print(f"dirs! {dirs}")
print(files_in_dirs)
for file in files_in_dirs:
#print(f"file names from files in dirs loop {file} and a subfolder name ")
y =8 # place holder
for nested_folder_name in dirs:
#print(f"nested file name! {nested_file_name}")
#print(f" files in dir : {file}")
t = 2 # place holder
print(f"nested file name {nested_folder_name} and file name {file}")
except NameError:
pass它给出了以下输出:
dirs! ['Patch Dock 6HUO Entire ECD GABA', 'Patch Dock 6HUO Entire ECD Xanax', 'Patch Dock 6HUO Xanax Interface', 'Patch Dock 6HUP Diazepam Interface', 'Patch Dock 6HUP Entire ECD Diazepam', 'Patch Dock 6HUP Entire ECD GABA', 'Patch Dock 6HUP TMD Diazepam']
[]
dirs! []
[]
dirs! []
[]
dirs! []
[]
dirs! []
[]
dirs! []
['docking Partial Pocket.pdb', 'docking.res.1.pdb', 'docking.res.10.pdb', 'docking.res.11.pdb', 'docking.res.12.pdb', 'docking.res.13.pdb', 'docking.res.14.pdb', 'docking.res.15.pdb', 'docking.res.16.pdb', 'docking.res.17.pdb', 'docking.res.18.pdb', 'docking.res.19.pdb', 'docking.res.2.pdb', 'docking.res.20.pdb', 'docking.res.3.pdb', 'docking.res.4.pdb', 'docking.res.5.pdb', 'docking.res.6.pdb', 'docking.res.7.pdb', 'docking.res.8.pdb', 'docking.res.9.pdb']
Process finished with exit code 0发布于 2020-07-31 07:16:37
只要我们确保使用的是完整路径名,subdir就是文件目录的全名,而它的基名就是您想要添加到文件中的内容。最好不要更改目录(尤其是不要使用您在os.walk中更改为的相同路径),只需将该路径设置为绝对路径并基于它执行路径操作即可。
try:
for subdir, dirs, files_in_dirs in os.walk(os.path.abspath(pathway)):
print(f"dirs! {dirs}")
print(files_in_dirs)
parent_name = os.path.basename(subdir)
for file in files_in_dirs:
if not file.startswith(parent_name):
new_name = f"{parent_name} {file}"
os.rename(os.path.join(subdir, file), os.path.join(subdir, newname))
except NameError:
pass发布于 2020-07-31 07:58:41
我不确定您是要重命名所有文件,还是只想将以其子文件夹为前缀的所有文件保存在列表中。
对于第二行代码,您可以使用一行代码(为了更好的可读性,以5行代码显示),例如:
[
os.path.join(dirpath, dirpath.replace("/", ".") + "." + filename)
for dirpath, _, filenames in os.walk(top_folder)
for filename in filenames
]在这个列表comprehension中有一个双重迭代,它首先遍历给定的top_folder (可能就是您所说的pathway),然后通过知道当前路径来遍历当前子文件夹中的文件。然后,您只需将路径分隔符(对我来说是"/")替换为另一个字符,例如".",即可将当前子文件夹放入当前文件名中。然后将每个结果作为元素添加到列表中。
对于第一个问题,tdelaney已经提供了一个解决方案。
https://stackoverflow.com/questions/63182612
复制相似问题