在Python中遍历子目录并保存在相同子目录中

2 投票
2 回答
680 浏览
提问于 2025-04-18 09:33

首先感谢你阅读这个内容。我在使用Python遍历子目录并保存文件时遇到了一些问题。下面的代码可以逐个遍历每个子目录,并处理文件以搜索特定的字符串,然后我用xlsxwriter生成一个xlsx文件,把我的搜索数据放到Excel里。

我有两个问题……

第一个问题是,我想在每个目录中处理一个文本文件,但文本文件的名字在每个子目录中都不一样,所以我不想指定'文本文件.txt',而是想用类似*.txt的方式(我可以在这里用glob吗?)

第二个问题是,当我打开或创建一个Excel文件时,我希望把文件保存到找到并处理过的.txt文件所在的同一个子目录。目前我的Excel文件是保存在Python脚本的目录下,因此每次打开和处理新的子目录时,文件都会被覆盖。把Excel文件最后保存到子目录会更好,还是可以在一开始就用当前子目录的路径创建它呢?

这是我部分有效的代码……

for root, subFolders, files in os.walk(dir_path):
    if 'Textfile.txt' in files:
        with open(os.path.join(root, 'Textfile.txt'), 'r') as f:

            #f = open(file, "r")    
            searchlines = f.readlines()
            searchstringsFilter1 = ['Filter Used          :']
            searchstringsFilter0 = ['Filter Used          : 0']

            timestampline = None
            timestamp = None
            f.close()

            # Create a workbook and add a worksheet.
            workbook = xlsxwriter.Workbook('Excel.xlsx', {'strings_to_numbers': True})
            worksheetFilter = workbook.add_worksheet("Filter")

再次感谢你关注这个问题。

MikG

2 个回答

0

你不需要使用glob,因为你已经在files这个变量里有一份文件列表了。所以,你可以对这个列表进行筛选,找出所有的文本文件:

import fnmatch
txt_files = filter(lambda fn: fnmatch.fnmatch(fn, '*.txt'), files)

如果你想把文件保存在同一个子目录里:

outfile = os.path.join(root, 'someoutfile.txt')
1

我不会完全帮你解决代码问题,但我可以给你一些提示:

文本文件的名字在每个子目录里都不一样,所以与其写死'文本文件.txt',我想用类似*.txt的方式来表示。

你可以列出目录下的所有文件,然后检查文件的后缀名。

for filename in files:  
  if filename.endswith('.txt'):  
    # do stuff

另外,在创建工作簿的时候,你能输入路径吗?你有根目录,对吧?那为什么不利用它呢?

撰写回答