Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字符串与CSV文件中的单元格匹配并返回相邻单元格_Python_Csv_Match - Fatal编程技术网

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

Python 将字符串与CSV文件中的单元格匹配并返回相邻单元格,python,csv,match,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]))

我有以下代码:

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不可用”,我只想知道它是否匹配。请提供相邻两行的信息,如果不匹配,请提供“lat&lng不可用”

有关完整代码,请参阅

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) 

我认为至少部分问题在于,您的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")
但是,由于self.jobs循环中的
fori
中的
i
本身就是一个
列表,因此它不能像那样用作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”
,以表明这一点,这就是内部
for
循环的
else
子句所做的


BTW,在<代码>自已.So作业中的每个条目中,打开和潜在地读取整个代码>邮政编码.CSV < /COD>文件,这是相当低效的,因此,您可能需要考虑在将EngultWorks>执行“<代码>”之前,将整个内容读入字典中。.

更多的上下文将非常有用。目前还不清楚所有这些变量实际上是什么。@kroolik编辑了主要问题,谢谢
self.jobs
'条目的
类型是什么?它与
行中的匹配吗
?请提供一个示例,这样每个人都不必一直猜测你的意思。这不是真正的SSCCE。无论如何,我建议验证在
jobs
列表的
jobs[I][3]
中结束的字符串值是否与
postcodes.csv
文件中至少一行的第一列中的一个值相匹配。此外,如果您将名称指定给整数常量,那么您的代码将更可读,这样您就可以编写类似于
self.jobs[i][POSTCODE]
——这也将有助于防止使用错误的索引值。您破解了它,我不敢相信它会像“else”在错误的位置那么简单!它需要与“for”的缩进相同,而不是“if”。postcodes.csv文件是71MB,所以我不确定这是否可行。谢谢你的帮助@martineau让我困惑的一件事是,如果通读Python,它是如何处理大量数据的?换句话说,有没有一种方法可以读取其中的所有数据并使其变得懒惰?@octopusgrabbus:如果您读取其中的所有数据,那么它将消耗存储某种数据结构所需的内存。可以一次只读取其中的一部分,或者推迟到实际需要时再读取。Python有一个
shelve
模块,它是一个类似于字典的持久化磁盘对象。然而,由于如今内存相当便宜且充足,读取71MB的csv文件并不是一件太值得关注的事情(而且读取速度很可能要快得多,尽管它完全是多次读取的).Paul:else
实际上只是一个小小的简化——主要的问题是试图用
i
索引
self.jobs
,它是一个列表而不是一个整数索引。@martineau我在程序开始时将邮政编码csv文件放入字典,现在速度快多了,谢谢!