如何让我的结合 CSV 的程序迭代目录中的多个子文件夹?

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

因此,我尝试使用 Python 分析 96 孔板多个孔中拍摄的细胞图像。 我能够从每个字段的所述图像生成数据的 csv 并按井对它们进行分组。 我编写了一个简单的脚本来组合每个孔中的所有 4 个 CSV(我对 4 个字段/孔进行成像),并从组合的 CSV 中生成一列值的直方图,并且它有效!

但是,只有每次都指定路径时它才有效 - 所以我必须单独运行 96 次并手动更改路径。

#combine csvs in one well 
import pandas as pd
import glob
import os
import matplotlib.pyplot as plt

# Get a list of all CSV files in any given directory
path = "/path/to/well/folder"
csv_files = glob.glob(os.path.join(path, "*.csv"))

# Create an empty list to store dataframes
df_list = []

# Read each CSV file and append it to the list
for file in csv_files:
    df = pd.read_csv(file)
    df_list.append(df)

# Concatenate all dataframes into one
combined_df = pd.concat(df_list, ignore_index=True)

# Save the combined dataframe to a new CSV file in the same place as 
combined_df.to_csv('path/to/well/folder/combined.csv', index=False)
#export descriptive stats

fig=combined_df['Mean'].hist()
plt.savefig("path/to/well/folder/fig.png")

我尝试编写一个程序,对名为“results”的目录中的所有子文件夹(以板的每个孔命名)进行迭代,但它不起作用,我不确定为什么。 这是我到目前为止所拥有的。任何帮助将不胜感激。

至关重要的是,最终目标是让每个子文件夹中的 4 个 CSV 中的每一个都成为每个子文件夹中的合并 CSV,而不是代表所有文件夹组合数据的一个大合并 CSV。这就是为什么我找不到与我在网上其他地方尝试做的事情相匹配的示例。

import pandas as pd
import glob
import os
import matplotlib.pyplot as plt

rootdir = "path/to/folder/of/well/folders"

subfolderlist = os.listdir(rootdir)
print(subfolderlist)

for i in subfolderlist:
    if not i.startswith('.'):
        print(os.listdir(os.path.join(rootdir,i)))
        csv_files = glob.glob(i, "*.csv")
        df_list = []
    
       for file in csv_files:
         df = pd.read_csv(file)
         df_list.append(df)
         combined_df = pd.concat(df_list, ignore_index=True)
         combined_df.to_csv(i + '/combined.csv', index=False)
         fig=combined_df['Mean'].hist()
         plt.savefig(i + '/fig.png')



“if not i.startswith('.'):”行是告诉它忽略也位于这个较大文件夹中的 .DS_Store 文件,所以我修复了该错误。 我得到的错误是:

csv_files = glob.glob(i, "*.csv")

TypeError: glob() takes 1 positional argument but 2 were given

但是我只给了它一个位置参数 - "i" ,它应该代表主目录中的每个子目录,对吗?我不知道为什么当我使用 (path, "*.csv") 在一个文件夹中运行文件时工作得很好,其中路径特别分配给一个目录,但现在当我试图告诉它迭代多个目录。

有什么帮助吗?

python python-3.x glob python-os
1个回答
0
投票

最好使用pathlib

from pathlib import Path


folder_path = Path("path/to/folder/of/well/folders")

csv_files = list(folder_path.rglob("*.csv"))
© www.soinside.com 2019 - 2024. All rights reserved.