如何制作一个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])
我正在制作一个数据集,在某种程度上,对于像“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])