嘿,我想将2000个Csv文件合并到2000个子文件夹之一中。每个子文件夹包含三个名称不同的Csv文件。所以我只需要从每个文件夹中选择一个Csv。
我知道用于合并一堆Csv文件的代码(如果它们在同一文件夹中)。
rndNum
但是我的2000 Csv文件问题看起来完全不同。
文件夹结构为: 主文件夹(在这2000个子文件夹中,在子文件夹中,我有多个Csv文件,我只需要从中选择一个Csv文件。最后隐藏所有2000个Csv文件。)
遵循命名约定(所有子文件夹都有不同的名称,但是子文件夹名称和该子文件夹中的Csv名称相同)
任何建议或示例代码(如何从子文件夹读取2000 Csv)都将有所帮助。
预先感谢
答案 0 :(得分:1)
我们可以迭代每个子文件夹,确定expected_csv_path
,检查是否存在。如果存在,我们将它们添加到我们的all_files
列表中。
尝试以下操作:
import pandas as pd
import os
path = r'Total_csvs'
li = []
for f in os.listdir(path):
expected_csv_path = os.path.join(path, f, f + '.csv')
csv_exists = os.path.isfile(expected_csv_path)
if csv_exists:
df = pd.read_csv(expected_csv_path, index_col=None, header=0)
li.append(df)
frame = pd.concat(li, axis=0, ignore_index=True, sort=False)
frame.to_csv('Total.csv',index=False)
答案 1 :(得分:1)
您可以使用os.listdir
遍历所有子文件夹。
由于CSV文件名与子文件夹名称相同,因此只需使用子文件夹名称来构造完整路径名。
import os
import pandas
folders = os.listdir("Total_csvs")
li = []
for folder in folders:
# Since they are the same name
selected_csv = folder
filename = os.path.join(folder, selected_csv + ".csv")
df = pd.read_csv(filename, index_col=None, header=0)
li.append(df)
frame = pd.concat(li, axis=0, ignore_index=True)
frame.to_csv('Total.csv',index=False)
答案 2 :(得分:0)
您可以执行以下操作而无需加入路径:
import pathlib,pandas
lastparent=None
for ff in pathlib.Path("Total_csvs").rglob("*.csv"): # recursive glob
print(ff)
if(ff.parent!=lastparent): # process the 1st file in the dir
lastparent= ff.parent
df = pd.read_csv(str(ff),... )
...etc.
答案 3 :(得分:0)
如果您使用的是Python 3.5或更高版本,则可以按照以下方式以递归方式使用glob.glob
:
import glob
path = r'Total_csvs'
all_csv = glob.glob(path+"/**/*.csv",recursive=True)
现在all_csv
是*.csv
内所有Total_csv
和Total_csv
的子目录以及Total_csv
的子目录的子目录的相对路径的列表。
例如,假设all_csv
现在是:
all_csv = ['Total_csvs/abc/abc.csv','Total_csv/abc/another.csv']
因此,我们需要获取名称与其居住目录相对应的文件,可以通过以下方式完成:
import os
def check(x):
directory,filename = x.split(os.path.sep)[-2:]
return directory+'.csv'==filename
all_csv = [i for i in all_csv if check(i)]
print(all_csv) #prints ['Total_csvs/abc/abc.csv']
现在all_csv
是您要搜索的所有.csv
的路径列表,在“扁平”(非递归)情况下,您可以像使用all_csv
一样使用它。