簡體   English   中英

Python:循環在python中打開多個文件夾和文件

[英]Python: Loop to open multiple folders and files in python

我是python的新手,目前從事數據分析工作。

我正在嘗試循環打開多個文件夾並讀取文件夾中的所有文件。 前任。 工作目錄包含10個需要打開的文件夾,每個文件夾包含10個文件。

我用 .txt 文件打開每個文件夾的代碼;

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

我想打開文件夾 1 並讀取所有文件,然后轉到文件夾 2 並讀取所有文件...直到文件夾 10 並讀取所有文件。 任何人都可以幫助我如何編寫循環來打開文件夾,包括需要使用的庫嗎?

我有 R 的背景,例如,在 RI 中可以編寫循環來打開文件夾和文件,使用下面的代碼。

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.
    }
}

這種遞歸方法將掃描給定目錄中的所有目錄,然后打印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

給定以下文件夾/文件樹:

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

您的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

我認為這樣做的好方法是使用 os.walk。 這將生成樹,然后您可以遍歷該樹。

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

此代碼將查找目錄內的所有目錄,打印出在那里找到的所有文件的名稱:

#--------*---------*---------*---------*---------*---------*---------*---------*
# 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      

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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM