我是python的新手,目前从事数据分析工作。
我正在尝试在循环中打开多个文件夹并读取文件夹中的所有文件。 防爆。工作目录包含打开所需的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.
}
}
答案 0 :(得分: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
答案 1 :(得分:0)
我认为这样做的好方法是使用os.walk。这将生成树,然后您可以遍历该树。
import os
directory = './'
for d in os.walk(directory):
print(d)
答案 2 :(得分:0)
此递归方法将扫描给定目录中的所有目录,然后打印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, recall this method
scan_folder(current_path)
scan_folder("/example/path") # Insert parent direcotry's path
答案 3 :(得分:0)
给出以下文件夹/文件树:
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
答案 4 :(得分: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
答案 5 :(得分: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())