如何制作一个csv文件,其中一列作为文件名,另一列作为文件夹名

How to make a csv file with one column as file name and other as folder name

我正在制作一个数据集,在某种程度上,对于像“apple”这样的东西,在根文件夹(包含多个文件夹)中有一个名为“apples”的文件夹,它只包含苹果的图像等等上。

我想制作一个 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'),
 ('apples', '2.txt'),
 ('apples', '3.txt'),
 ('apples', '4.txt'),
 ('apples', '5.txt'),
 ('apples', '6.txt'),
 ('apples', '7.txt'),
 ('apples', '8.txt'),
 ('apples', '9.txt'),
 ('bananas', '0.txt'),
 ('bananas', '1.txt'),
 ('bananas', '2.txt'),
 ('bananas', '3.txt'),
 ('bananas', '4.txt'),
 ('bananas', '5.txt'),
 ('bananas', '6.txt'),
 ('bananas', '7.txt'),
 ('bananas', '8.txt'),
 ('bananas', '9.txt'),
 ('oranges', '0.txt'),
 ('oranges', '1.txt'),
 ('oranges', '2.txt'),
 ('oranges', '3.txt'),
 ('oranges', '4.txt'),
 ('oranges', '5.txt'),
 ('oranges', '6.txt'),
 ('oranges', '7.txt'),
 ('oranges', '8.txt'),
 ('oranges', '9.txt')]

最后,我将上面的列表转换为 pandas 数据帧并将其另存为 csv 到测试文件:

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

csv 的内容:

here 所写,writerow() 函数可以与列表一起使用。在您的示例中,data=[] 是列表,它被放入 writerow().

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

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

    writer.writerow([filename, dirname])