访问子文件夹中的文本文件

Accessing text file within subfolder

文件结构
我有一个名为 test_folder 的文件夹,其中有几个子文件夹(命名为不同的水果名称,您将在下面的代码中看到)。在每个子文件夹中,总是有一个 metadump.xml 文件,我从中提取信息。

当前立场
我已经能够在个人基础上实现这一点,我在其中指定了子文件夹路径。

import re

in_file = open("C:/.../Downloads/test_folder/apple/metadump.xml")
contents = in_file.read()
in_file.close()

title = re.search('<dc:title rsfieldtitle="Title" 
rsembeddedequiv="Name" rsfieldref="8" rsfieldtype="0">(.+?)</dc:title>', 
contents).group(1)
print(title)

后续步骤
我想通过简单地引用父文件夹 C:/.../Downloads/test_folder 并让我的程序找到 xml 来更大规模地执行以下功能为每个子文件夹提取所需的信息,而不是单独指定每个水果子文件夹。

澄清
我不是简单地获取子文件夹列表或这些子文件夹中的 xml 文件列表,而是希望物理访问这些子文件夹以从每个子文件夹中的每个 xml 文件执行此文本提取功能。

在此先感谢您的帮助。

这可能对您有帮助:

import os
for root, dirs, files in os.walk("/mydir"):
    for file in files:
        if file.endswith(".xml"):
            print(os.path.join(root, file))

您可以使用 os.listdir 如下:

import os
parent_folder = 'C:/.../Downloads/test_folder'
subfolders = os.listdir(parent_folder)
for subfolder in subfolders:
    in_file = open(parent_folder+'/'+ subfolder+'/metadump.xml')
    contents = in_file.read()
    in_file.close()
    title = re.search('<dc:title rsfieldtitle="Title" 
    rsembeddedequiv="Name" rsfieldref="8" rsfieldtype="0">(.+?)</dc:title>', 
    contents).group(1)
    print(title)

如果您不确定文件夹中的子文件夹数量,可以使用 glob 模块来执行此操作。 recursive=True 将检查文件夹 C:/../Downloads/test_folder/ 中的所有子文件夹并为您提供所有 metadump.xml 文件的列表

import re
import glob
for file in glob.glob("C:/**/Downloads/test_folder/**/metadump.xml", recursive=True):
    with open(file) as in_file:
        contents= in_file.read()
    title = re.search('<dc:title rsfieldtitle="Title" 
rsembeddedequiv="Name" rsfieldref="8" rsfieldtype="0">(.+?)</dc:title>', 
contents).group(1)
    print(title)

您可以使用 Python 的 os.walk() 遍历所有子文件夹。如果文件是 metadump.xml,它将打开它并提取您的标题。显示文件名和标题:

import os

for root, dirs, files in os.walk(r"C:\...\Downloads\test_folder"):
    for file in files:
        if file == 'metadump.xml':
            filename = os.path.join(root, file) 

            with open(filename) as f_xml:
                contents = f_xml.read()
                title = re.search('<dc:title rsfieldtitle="Title" rsembeddedequiv="Name" rsfieldref="8" rsfieldtype="0">(.+?)</dc:title>', contents).group(1)
                print('{} : {}'.format(filename, title))