Python: 循环打开多个文件夹和文件

6

我是一名新手,目前正在从事数据分析工作。

我正在尝试在循环中打开多个文件夹并读取文件夹中的所有文件。 例如:工作目录包含10个需要打开的文件夹,每个文件夹包含10个文件。

我用于打开每个带有 .txt 文件的文件夹的代码如下:

file_open = glob.glob("home/....../folder1/*.txt")

我希望打开文件夹1并读取其中所有文件,然后转到文件夹2并读取其中所有文件......直到文件夹10并读取其中所有文件。请问有人能帮我编写循环以打开文件夹吗?需要使用哪些库来实现?
我的背景是R语言,例如,在R中,我可以使用以下代码编写循环以打开文件夹和文件。
folder_open <- dir("......./main/")
for (n in 1 to length of (folder_open)){
    file_open <-dir(paste0("......./main/",folder_open[n]))

    for (k in 1 to length of (file_open){
        file_open<-readLines(paste0("...../main/",folder_open[n],"/",file_open[k]))
        //Finally I can read all folders and files.
    }
}

1
这个有帮助吗?链接 - GalAbra
没有一个答案真正回答了这个问题!这个问题是关于从文件夹1到文件夹10的特定目录列表,而不是所有目录(其中可能有成千上万个)的。 - PhilHibbs
6个回答

5
这个递归方法将扫描给定目录中的所有目录,然后打印出txt文件的名称。我诚挚地邀请您继续前进。
import os

def scan_folder(parent):
    # iterate over all the files in directory 'parent'
    for file_name in os.listdir(parent):
        if file_name.endswith(".txt"):
            # if it's a txt file, print its name (or do whatever you want)
            print(file_name)
        else:
            current_path = "".join((parent, "/", file_name))
            if os.path.isdir(current_path):
                # if we're checking a sub-directory, recursively call this method
                scan_folder(current_path)

scan_folder("/example/path")  # Insert parent direcotry's path

1
os.walk做同样的事情。 - Reck
我同意,它们很相似。个人认为在采用内置函数之前最好先练习和使用命令式代码。 - GalAbra
1
是的,为了练习更好。对于应用程序,我们可以选择不重复造轮子。 - Reck
知道了,晚上好。 - GalAbra

2

给定以下文件夹/文件树:

C:.
├───folder1
│       file1.txt
│       file2.txt
│       file3.csv
│
└───folder2
        file4.txt
        file5.txt
        file6.csv

下面的代码将递归地定位树中的所有 .txt 文件:
import os
import fnmatch

for path,dirs,files in os.walk('.'):
    for file in files:
        if fnmatch.fnmatch(file,'*.txt'):
            fullname = os.path.join(path,file)
            print(fullname)

输出:

.\folder1\file1.txt
.\folder1\file2.txt
.\folder2\file4.txt
.\folder2\file5.txt

1
你的glob()模式几乎正确。请尝试以下其中之一:
file_open = glob.glob("home/....../*/*.txt")
file_open = glob.glob("home/....../folder*/*.txt")

第一个将检查home/......的任何一级子目录中的所有文本文件,不管那是什么。第二个将限制自己只针对命名为“folder1”、“folder2”等的子目录。
我不会说R语言,但这可能会翻译您的代码:
for filename in glob.glob("......../main/*/*.txt"):
    with open(filename) as file_handle:
        for line in file_handle:
            # perform data on each line of text

0

我认为一个不错的方法是使用os.walk。这将生成树形结构,然后您可以遍历该树形结构。

import os
directory = './'
for d in os.walk(directory):
    print(d)

为什么有些评论被当做答案?其实并没有真正的答案,这只是你提供的建议。 - Reck
@Reck,请建议一种将此评论转化为回答的方法。 - Alex
添加一些代码,将您的建议作为答案。 - Reck
没有这样的按钮可以将此评论转换为答案,否则我一定会帮助你。 - Reck
问题不是列出所有目录,而只是目录“folder1”到“folder10”。 - PhilHibbs

0
这段代码将在一个目录中查找所有的子目录,并打印出找到的所有文件的名称。
#--------*---------*---------*---------*---------*---------*---------*---------*
# Desc: print filenames one level down from starting folder
#--------*---------*---------*---------*---------*---------*---------*---------*

import os, fnmatch, sys

def find_dirs(directory, pattern):
    for item in os.listdir(directory):
        if os.path.isdir(os.path.join(directory, item)):
            if fnmatch.fnmatch(item, pattern):
                filename = os.path.join(directory, item)
                yield filename


def find_files(directory, pattern):
    for item in os.listdir(directory):
        if os.path.isfile(os.path.join(directory, item)):
            if fnmatch.fnmatch(item, pattern):
                filename = os.path.join(directory, item)
                yield filename



#--------*---------*---------*---------*---------*---------*---------*---------#
while True:#                       M A I N L I N E                             #
#--------*---------*---------*---------*---------*---------*---------*---------#
#                                  # Set directory
    os.chdir("C:\\Users\\Mike\\\Desktop")

    for filedir in find_dirs('.', '*'):
        print ('Got directory:', filedir)
        for filename in find_files(filedir, '*'):
            print (filename)

    sys.exit() # END PROGRAM      

0

pathlib 是一个不错的选择

from pathlib import Path

# or use: glob('**/*.txt')
for txt_path in [_ for _ in Path('demo/test_dir').rglob('*.txt') if _.is_file()]:
    print(txt_path.absolute())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接