将字符串与CSV文件中的单元格匹配并返回相邻的单元格

时间:2013-12-29 17:14:18

标签: python csv match

我有以下代码:

for i in self.jobs:
    with open('postcodes.csv', 'rb') as f:                
        reader = csv.reader(f)
        for row in reader:
            if row[0] == self.jobs[i][3]:
                self.jobs[i].append((row[1],row[2]))
            else:
                self.jobs[i].append('lat & lng not available)

我的问题是这会为csv文件中的每一行产生“lat& lng not available”,我只想知道它是否匹配给我相邻两行的信息,如果没有,给我'lat& lng不可用'。

有关完整代码,请参阅http://pastebin.com/gX5HtJV4

SSCCE可以如下:

reader = [('HP2 4AA', '51.752927', '-0.470095'), ('NE33 3GA', '54.991663', '-1.414911'), ('CV1 1FL','52.409463', '-1.509234')]
selfjobs = ['NE33 3AA', 'CV1 1FL', 'HP2 4AA']

latlng = []

for row in reader:
    for i in selfjobs:
        if i in row[0]:
            latlng.append((row[1],row[2]))
        else:
            latlng.append(('not available','not available'))    

print latlng

在Martineau的评论帮助下,这是我最终得到的代码:

for i in self.jobs:
        job = self.jobs[i]
        postcode = job[3]
        home = (54.764919,-1.368824)
        with open('postcodes.csv', 'rb') as f:
            reader = csv.reader(f)
            for row in reader:
                postcode_csv = row[0]
                if postcode in postcode_csv:
                    job.append((row[1], row[2]))
            else:
                 job.append(home) 

1 个答案:

答案 0 :(得分:0)

我认为至少部分问题是你的pastebin代码实际上有以下内容:

    for i in self.jobs:
        with open('postcodes.csv', 'rb') as f:
            reader = csv.reader(f)
            for row in reader:
                if row[0] == self.jobs[i][3]:
                    self.jobs[i].append((row[1], row[2]))
                elif self.jobs[i][3] != row[0]:
                    self.jobs[i].append("nothing")

但是,由于i循环中的for i in self.jobs本身是list,因此不能将其用作self.jobs的索引。相反,我认为在循环中执行以下操作会更有意义:

    for job in self.jobs:
        with open('postcodes.csv', 'rb') as f:
            for row in csv.reader(f):
                if row[0] == job[3]:
                    job.append((row[1], row[2]))
                    break
            else: # no match
                job.append("nothing")

...仅索引从csv文件读入的行中的数据字段。为了提高效率,它会在找到匹配项后立即停止读取文件。如果它在没有找到匹配的情况下读取整个文件,它会附加"nothing"来指示这一点,这就是内部else循环的for子句正在做的事情。

顺便说一句,打开并且可能读取整个postcodes.csv文件对于self.jobs中的每个条目来说,效率似乎相当低,所以你可能要考虑将整个内容读入字典,一次, 执行for job in self.jobs:循环之前(假设文件不是太大)。