使用 glob 查找文件夹和子文件夹中的所有 csv 文件,但返回列表为空

问题描述 投票:0回答:1

所以我的最终目标是将多个 .csv 文件中的数据添加到 Jupyter Notebook 中的数据框中。 在将它们添加到一起之前,我一直在尝试每一个部分,但无法通过仅获取文件名。文件夹中还有其他非 csv 文件,我想忽略。

我有一个具有以下结构的文件。 粗体的是我想要的:

目录:E:\研究生院\Research\Pearl_River\Data_Collection\Previous_work\CRMS_Data

| -Full_Acretion
| -Full_Accretion\Full_Accretion.csv
| -Full_Accretion\RESTORE_disclaimer.txt
| -完整_离散_水文
| -Full_Discrete_Hydrography\Full_Accretion.csv
| -Full_Discrete_Hydrography\RESTORE_disclaimer.txt
| -完整沼泽植被
| -Full_Marsh_Vegetation\Full_Accretion.csv
| -Full_Marsh_Vegetation\RESTORE_disclaimer.txt
(还有更多,但这并不重要)

我已经阅读了很多返回空列表的 glob 问题,并且尝试了很多代码迭代。我验证了文件存在、拼写正确、路径正确。我尝试过字符串文字或使用转义字符。它只返回一个空列表。

这是最新的迭代

#Combine all the CRMS data into one dataframe
import os
from glob import glob
from pathlib import Path

dfs = []
fdir = r'E:\Grad School\Research\Pearl_River\Data_Collection\Previous_work\CRMS_Data'
ftype = '*.csv'
all_files = [os.path.basename(i) for i in glob(r'E:\Grad 
School\Research\Pearl_River\Data_Collection\Previous_work\CRMS_Data\*.csv')]

#Get file names
#for path, subdir, files in os.walk(fdir):
#    for file in glob(os.path.join(fdir, ftype)):
#        all_files.append(file)
print(all_files)

#Get data
#for file in all_files:
#    data = pd.read_csv(file, index_col=None)
#    dfs.append(data)

#Add data to dataframe
#df = pd.concat(dfs)
#df.head(5)

被注释掉的东西是我尝试过的其他东西。 os.getcwd() 返回 'C:\Users\w****\OneDrive - The University of Southern Mississippi\Research\Python' 但我并没有尝试访问工作目录。

这也行不通。结果相同,列表为空。

os.chdir(r'E:\Grad School\Research\Pearl_River\Data_Collection\Previous_work\CRMS_Data')
all_files = [f for file in glob('*/.csv', recursive=True)]

os.chdir(r'E:\Grad School\Research\Pearl_River\Data_Collection\Previous_work\CRMS_Data')
all_files = [f for file in glob(r'*\.csv', recursive=True)]

我尝试了很多不同的事情,但我已经盯着它太久了。即使 fdir 和 ftype 中都有 r'.csv'、r'*.csv'、r'/.csv' 的各种迭代,被注释掉的循环也会返回一个空列表。

最后,我将其放入 Spyder(通过 Anaconda),这样我就可以使用调试器,我注意到,对于第一个被注释掉的循环,如下:
在外循环的第一遍中,它会看到子文件夹并将其放入子目录中,并且文件为空。
然后它移动到第一个子文件夹“Full_Accretion”,并且还显示 files=[] 中的文件。
虽然没有列出文件变量,但应该将其附加到列表中。
所以我把它改成这样:

for path, subdir, files in os.walk(fdir):
    for file in files:
        all_files.append(file)  

它给了我文件名,但它是所有文件名,而不仅仅是 csv。我将 *.csv 添加到 fdir 名称中,它再次给了我一个空列表。

我过去没有太多使用 glob,所以这很可能是用户错误。我缺少什么?谢谢! (任何缺失的不直接相关的导入,例如 pandas,都位于此上方的单元格中)

编辑: @bhlsing 给了我缺失的部分。如果我使用单行,它最终要么不添加完整路径,要么循环太多次并且循环有重复项。我想通了,这就是最终的效果:

import os
from glob import glob
import pandas as pd


all_files = []
fdir = r'E:\Grad 
School\Research\Pearl_River\Data_Collection\Previous_work\CRMS_Data'

fnames = [os.path.basename(i) 
         for i in glob(r'E:\Grad School\Research\Pearl_River\
         Data_Collection\Previous_work\CRMS_Data\*\*.csv')
         ]

#Get file names
for fname in fnames:
    filename = os.path.join(fdir, fname)
    all_files.append(filename)
print(all_files)

它可能不是Pythonic;我是自学成才,并且仍在学习。谢谢!

python csv glob
1个回答
0
投票

查看对您问题的编辑,我不明白为什么您采用文件名(os.path.basename),然后将其与基本目录/文件夹名称连接:这将删除在其中找到 CSV 的任何中间目录.

考虑这个简单的文件树:

- base_dir
 - a
    bar.csv
    foo.txt
 - b
    baz.csv

跑步:

import os
from glob import glob


all_files = []
fdir = "base_dir"

fnames = [os.path.basename(i) for i in glob("base_dir/*/*.csv")]

# Get file names
for fname in fnames:
    filename = os.path.join(fdir, fname)
    all_files.append(filename)

print(all_files)

打印:

[
    'base_dir/bar.csv', 
    'base_dir/baz.csv',
]

鉴于您最初的问题,我认为您可以简单地解决以下问题:

all_csvs = glob("base_dir/*/*.csv")

或:

for fname in glob("base_dir/*/*.csv"):
    # do something w/fname
    print(fname)

您的示例文件仅显示您关心名为 Full_Accretion.csv 的 CSV。如果这不仅仅是一个非常小的样本名称集的产物,那么 glob 可以反映这一点:

glob("base_dir/*/Full_Accretion.csv")
© www.soinside.com 2019 - 2024. All rights reserved.