我有以下代码:
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)
答案 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:
循环之前(假设文件不是太大)。