在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 
+0

是'id'意思是文件名,不带扩展? – asongtoruin

+0

是的。在这里,我提取的'ID = d.split( “/”) ID = ID [-1] .split( “”)' – cpwah

+0

你可以看到文本文件@ason​​gtoruin – cpwah

你的问题是,当你做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.splitextos.path.basename的组合,获取文件名和扩展名是整洁和相当一致的。

+0

的实例其实你想'操作系统。 path.splitext(os.path.basename(d))'。你也可以使用'glob.glob('/ train/*/*。jpg')' – fernandezcuesta

+0

@fernandezcuesta简化搜索,你是对的 - 编辑。 – asongtoruin

+0

是的。你是对的@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()