【问题标题】:Python - loop through subfolders and files in a directory without ignoring the subfolderPython - 遍历目录中的子文件夹和文件而不忽略子文件夹
【发布时间】:2018-05-22 00:02:21
【问题描述】:

我已经阅读了所有关于循环子文件夹的堆栈交换帮助文件,以及操作系统文档,但我仍然卡住了。我正在尝试遍历子文件夹中的文件,打开每个文件,提取第一行中的第一个数字,将文件复制到不同的子文件夹(具有相同的名称但在输出目录中)并将文件副本重命名为一个后缀。

import os
import re
outputpath = "C:/Users/Heather/Dropbox/T_Files/Raw_FRUS_Data/Wisconsin_Copies_With_PageNumbers"
inputpath = "C:/Users/Heather/Dropbox/T_Files/Raw_FRUS_Data/FRUS_Wisconsin"
suffix=".txt" 
for root, dirs, files  in os.walk(inputpath):
    for file in files:
        file_path = os.path.join(root, file)
        foldername=os.path.split(os.path.dirname(file_path))[1]
        filebname=os.path.splitext(file)[0]
        filename=filebname + "_"
        f=open(os.path.join(root,file),'r')
        data=f.readlines()
        if data is None:
            f.close() 
        else:
            with open(os.path.join(root,file),'r') as f:
                for line in f:
                    s=re.search(r'\d+',line)
                    if s:
                        pagenum=(s.group())
                        break
        with open(os.path.join(outputpath, foldername,filename+pagenum+suffix), 'w') as f1:
            with open(os.path.join(root,file),'r') as f:
                for line in f:
                    f1.write(line)

我希望结果是输入目录中文件的副本放置在输出目录中的相应子文件夹中,并用后缀重命名,例如“005_2”,其中005是原始文件名,2是编号从中提取的python代码。

我得到的错误似乎表明我没有正确循环文件。我知道提取第一个数字和重命名文件的代码是有效的,因为我在单个文件上对其进行了测试。但是使用 os.walk 遍历多个子文件夹是行不通的,我不知道我做错了什么。这是错误:

File "<ipython-input-1-614e2851f16a>", line 23, in <module>
    with open(os.path.join(outputpath, foldername,filename+pagenum+suffix), 'w') as f1:
IOError: [Errno 2] No such file or directory: 'C:/Users/Heather/Dropbox/T_Files/Raw_FRUS_Data/Wisconsin_Copies_With_PageNumbers\\FRUS_Wisconsin\\.dropbox_1473986809.txt'

【问题讨论】:

  • 运行代码前“FRUS_Wisconsin”目录是否存在?
  • 您可能正在尝试复制一个不再存在的临时文件。您确定对以. 点开头的文件感兴趣
  • 您将需要检查子文件夹是否存在,如果不存在,则创建它,然后写入。或者在运行上述代码之前在目标路径中重新创建目录结构,也许。
  • 另外,in FRUS_Wisconsin 是否有您要复制的文件?还是只有子目录?
  • 另外,windows路径分隔符是\\ ,所以应该是C:\\Users\\Heather\\

标签: python subdirectory


【解决方案1】:

好吧,这不是雄辩的,但它确实有效

from glob import glob
folderlist=glob("C:\\...FRUS_Wisconsin*\\")
outputpath = "C:\\..\Wisconsin_Copies_With_PageNumbers"
for folder in folderlist:
    foldername = str(folder.split('\\')[7])
    for root, dirs, files in os.walk(folder):
        for file in files:
            filebname=os.path.splitext(file)[0]
            filename=filebname + "_"
            if not filename.startswith('._'):
                with open(os.path.join(root,file),'r') as f:
                    for line in f:
                        s=re.search(r'\d+',line)
                        if s:
                           pagenum=(s.group())
                           break
                     with open(os.path.join(outputpath, foldername,filename+pagenum+suffix), 'w') as f1:
                        with open(os.path.join(root,file),'r') as f:
                            for line in f:
                                f1.write(line)

【讨论】:

    猜你喜欢
    • 2018-12-20
    • 1970-01-01
    • 2017-02-08
    • 2021-12-20
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2011-02-02
    相关资源
    最近更新 更多