如何制作一列为文件名,另一列为文件夹名的csv文件

问题描述

我正在制作一个数据集,该数据集的方式使得对于像“苹果”这样的东西,在根文件夹(包含多个文件夹)中有一个名为“苹果”的文件夹,该文件夹仅包含苹果的图像,依此类推。

我想制作一个csv文件,其中所有文件名都作为一列,而其他文件名作为文件夹名。

我试过了,但是它正在按行输入数据

from PIL import Image
import csv
import os
subdirs = [x[0] for x in os.walk('Training images')]
print(subdirs)
data=[]
with open('images.csv','w',newline='') as writeFile:
    writer = csv.writer(writeFile)
    for i in range(len(subdirs)):
        for filename in os.listdir(subdirs[i]):
            data.append(filename)
            writer.writerow(data)
            data=[]
writeFile.close()

解决方法

以下代码仅创建用于测试的目录结构:

import os

os.mkdir("root")
os.mkdir("root/apples")
os.mkdir("root/oranges")
os.mkdir("root/bananas")

for foldername in ["apples","oranges","bananas"]:
    for i in range(0,10):
        with open(os.path.join("root",foldername,f"{i}.txt"),'w') as f:
            f.write("test")

现在,我遍历root目录中的所有文件夹,并将其中的文件名及其文件夹名附加到列表中:

list_ = []
for folder in os.listdir("root"):
    list_of_file_names = os.listdir(os.path.join("root",folder))
    list_ = list_ + list(zip([folder]*len(list_of_file_names),list_of_file_names))

list_如下所示:

[('apples','0.txt'),('apples','1.txt'),'2.txt'),'3.txt'),'4.txt'),'5.txt'),'6.txt'),'7.txt'),'8.txt'),'9.txt'),('bananas',('oranges','9.txt')]

最后,我将上述列表转换为熊猫数据框,并将其另存为csv到测试文件:

df = pd.DataFrame(list_)
df.to_csv("test.csv",index=False)

csv的内容:

enter image description here

,

here所述,writerow()函数可用于列表。在您的示例中,data=[]是列表,并将其放入writerow()

您只能附加一项:data.append(filename)。只需附加另一个:data.append(dirname)

或者根本没有温度变量data(推荐,更少的代码=更易于理解):

    writer.writerow([filename,dirname])