问题描述
我正在制作一个数据集,该数据集的方式使得对于像“苹果”这样的东西,在根文件夹(包含多个文件夹)中有一个名为“苹果”的文件夹,该文件夹仅包含苹果的图像,依此类推。
我想制作一个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的内容:
,如here所述,writerow()
函数可用于列表。在您的示例中,data=[]
是列表,并将其放入writerow()
。
您只能附加一项:data.append(filename)
。只需附加另一个:data.append(dirname)
。
或者根本没有温度变量data
(推荐,更少的代码=更易于理解):
writer.writerow([filename,dirname])