我要创建一个csv文件,它包含两列,第一列是图像的标签,第二列是图像的地址,以下是我的代码:
import os
import os.path as osp
import sys
import xml.etree.ElementTree as ET
import csv
data_dir = '/home/xieyangyang/Downloads/SiamFC/Data/VID/train/a'
video_names = os.listdir(data_dir)
for idx, video in enumerate(video_names):
video_path = osp.join(data_dir, video)
file_list = os.listdir(video_path)
idex = idx
for item in file_list:
with open("test.csv","a+") as csvfile:
idex = str(idex)
src = osp.join(video_path, item)#addres
#print(src)
#print(idex)
writer = csv.writer(csvfile)
writer.writerows([idex, src])
但是csv非常不正常:
['2', '0', '1']
['/', 'h', 'o', 'm', 'e', '/', 'x', 'i', 'e', 'y', 'a', 'n', 'g', 'y', 'a', 'n', 'g', '/', 'D', 'o', 'w', 'n', 'l', 'o', 'a', 'd', 's', '/', 'S', 'i', 'a', 'm', 'F', 'C', '/', 'D', 'a', 't', 'a', '/', 'V', 'I', 'D', '/', 't', 'r', 'a', 'i', 'n', '/', 'a', '/', 'c', 'a', 'r', '3', '7', '/', '2', '0', '1', '_', '0', '0', '5', '0', '7', 'v', '.', 'j', 'p', 'g']
但我想要的是:
['1496', 'bounding_box_train/1496_c1s6_022396_05.jpg']
我该怎么办?
答案 0 :(得分:4)
第一个问题:在外循环中,您正在一次读取图像,而在其中,您一次又一次地为读取的每个图像打开csv文件。
应该怎么做:
with open("test.csv","a+") as csvfile:
writer = csv.writer(csvfile)
for idx, video in enumerate(video_names):
... write data ...
第二个问题:您应该使用writer.writerow([idex, src])
而不是writer.writerows([idex, src])
(注意“ s”)。第二行(writerows)认为,您给它提供了两行,其中之一是 idex ,另一行是 src
答案 1 :(得分:2)
如果您删除多余的“ s”,它将起作用
writer.writerows([idex, src])
应该是
writer.writerow([idex, src])
您正在使用的函数是可迭代的,这就是它在输出文件中逐字符写入char的原因。