所以我的最终目标是将多个 .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;我是自学成才,并且仍在学习。谢谢!
查看对您问题的编辑,我不明白为什么您采用文件名(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")