在csv文件中搜索
我正在编写一个脚本,用于从不同目录中读取文件;然后我使用文件ID在csv
文件中搜索。这是一段代码。在csv文件中搜索
import os
import glob
searchfile = open("file.csv", "r")
train_file = open('train.csv','w')
listOfFiles = os.listdir("train")
for l in listOfFiles:
dirList = glob.glob(('/train/%s/*.jpg') % (l))
for d in dirList:
id = d.split("/")
id = id[-1].split(".")
print id[0] # ID
for line in searchfile:
if id[0] in line: # search in csv file
value= line.split(",")
value= value[1]+" "+ value[2] + "\n"
train_file.write(id[0]+","+value) # write description
break
searchfile.close()
train_file.close()
不过,我从csv
文件的ID只能够搜索夫妇。有人能指出我的错误吗? (请参阅说明评论)
EDITED
的文本文件的实例。
192397335,carrello porta utensili 18x27 eh l 411 x p 572 x h 872 6 cassetti,,691.74,192397335.jpg
你的问题是,当你做for line in searchfile:
你正在循环发电机。该文件不复位每id
- 例如,如果你传递给它的第id
是在第50行,下id
将开始行检查51
相反,你可以阅读您的文件到列表环比列表,而不是:
import os
import glob
with open("file.csv", "r") as s:
search_file = s.readlines()
train_file = open('train.csv', 'w')
list_of_files = os.listdir("train")
for l in list_of_files:
dirList = glob.glob(('/train/%s/*.jpg') % (l))
for d in dirList:
fname = os.path.splitext(os.path.basename(d))
print fname[0] # ID
for line in search_file:
if fname[0] in line: # search in csv file
value = line.split(",")
value = value[1]+" " + value[2] + "\n"
train_file.write(fname[0]+","+value) # write description
break
train_file.close()
我做了几个其他的变化太大 - 首先,你不应该使用名称id
,因为它在Python已经意义 - 我拿起fname
而不是表示文件名。其次,我按照惯例将您的CamelCase名称设为小写。最后,通过os.path.splitext
和os.path.basename
的组合,获取文件名和扩展名是整洁和相当一致的。
的实例其实你想'操作系统。 path.splitext(os.path.basename(d))'。你也可以使用'glob.glob('/ train/*/*。jpg')' – fernandezcuesta
@fernandezcuesta简化搜索,你是对的 - 编辑。 – asongtoruin
是的。你是对的@fernandezcuesta – cpwah
您需要浏览找到的每个id的searchfile行,但是当您在循环外部打开该文件时,只需在整个循环中读取每行一次。
你要么加载列表中的全部文件和迭代循环内的行列表,或者如果searchfile是真的大,恐怕也就适合在内存中重新循环内的文件:
列表版本:
with open("file.csv", "r") as searchfile:
searchlines = searchfile.readlines()
train_file = open('train.csv','w')
listOfFiles = os.listdir("train")
for l in listOfFiles:
dirList = glob.glob(('/train/%s/*.jpg') % (l))
for d in dirList:
id = d.split("/")
id = id[-1].split(".")
print id[0] # ID
for line in searchlines: # now a list so start at the beginning on each pass
if id[0] in line: # search in csv file
value= line.split(",")
value= value[1]+" "+ value[2] + "\n"
train_file.write(id[0]+","+value) # write description
break
train_file.close()
重新打开版本
train_file = open('train.csv','w')
listOfFiles = os.listdir("train")
for l in listOfFiles:
dirList = glob.glob(('/train/%s/*.jpg') % (l))
for d in dirList:
id = d.split("/")
id = id[-1].split(".")
print id[0] # ID
searchfile = open("file.csv", "r")
for line in searchfile:
if id[0] in line: # search in csv file
value= line.split(",")
value= value[1]+" "+ value[2] + "\n"
train_file.write(id[0]+","+value) # write description
break
searchfile.close()
train_file.close()
是'id'意思是文件名,不带扩展? – asongtoruin
是的。在这里,我提取的'ID = d.split( “/”) ID = ID [-1] .split( “”)' – cpwah
你可以看到文本文件@asongtoruin – cpwah