【问题标题】:Python for loop only running once?Python for 循环只运行一次?
【发布时间】:2021-06-15 03:59:58
【问题描述】:

此脚本会根据 csv 中的数据库查询包含物种名称的 csv,如果两者都存在则返回。问题是虽然它仍在阅读所有要搜索的术语,但它只搜索第一个。即如果我在“for row in p”之前打印物种,所有物种名称都会正确返回

from pathlib import Path
import os
import csv

p = csv.reader(open('Paldat.csv','r',newline=''), delimiter=',')

with open('newsssssss.csv','r',newline='\n')as r:
    for line in r:
        taxons=line.split(',')
        no = ['\r\n']
        noo = ['\n']
        
        if taxons == no:
                continue
        elif taxons == noo:
                continue        
        else:
            speciesl = []
            for val in taxons:
                val = val.replace('\n','')
                speciesl.append(val)
            g=speciesl[0].lower()
            if len(speciesl) < 2:
                continue
            else:
                s=speciesl[1].lower()
        for row in p: #This loop seems to be the issue
                genus = row[0].lower()
                species = row[1].lower()
                if g == genus and s == species:
                    print('Perfect match')
                    print(g)
                elif s == species:
                    print(speciesl)
                    print('Species found')
                else:
                    continue
        else:
                continue

这是 Paldat.csv 的一部分:

Camassia,leichtlinii,monad,monad,large (51-100 µm),-,-,-,-,-,sulcate,heteropolar,oblate,-,elliptic,-,-,boat-shaped,no suitable term,aperture(s) sunken,1,sulcus,sulcate,aperture membrane ornamented,-,-,-,"reticulate, heterobrochate, perforate",-,-,-,-,-,-,-,-,-,-,-,present,,
Cistus,parviflorus,monad,monad,medium-sized (26-50 µm),-,-,-,-,-,colporate,isopolar,-,spheroidal,circular,-,-,spheroidal,circular,"aperture(s) sunken, not infolded",3,colporus,"colporate, tricolporate",-,-,-,-,striato-reticulate,-,-,-,-,-,-,-,-,-,-,-,absent,,
Camellia,japonica,monad,monad,medium-sized (26-50 µm),41-50 µm,36-40 µm,41-50 µm,41-50 µm,41-50 µm,colpate,isopolar,-,spheroidal,circular,oblique,prolate,-,triangular,aperture(s) sunken,3,colpus,"colpate, tricolpate",operculum,"granulate, scabrate, reticulate",-,-,microreticulate,-,-,-,-,-,-,-,-,-,-,-,-,,
Camellia,sinensis,monad,monad,medium-sized (26-50 µm),41-50 µm,36-40 µm,41-50 µm,41-50 µm,41-50 µm,colporate,isopolar,oblate,-,triangular,oblique,isodiametric,-,triangular,aperture(s) sunken,3,colporus,"colporate, tricolporate",operculum,"scabrate,  verrucate,  gemmate",-,-,"verrucate, perforate",-,-,-,-,-,-,-,-,-,-,-,-,,

以及 newsssssss.csv 的一部分:

Camassia,leichtlinii

Camellia,japonica

Camellia,sinensis

Chrysanthemum,leucanthemum

Cirsium,arvense

Cissus,quadrangularis

【问题讨论】:

  • 请提供预期的minimal, reproducible example (MRE)。我们应该能够复制和粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。显示中间结果与您的预期不同的地方。您发布的代码不是最少的;运行失败是因为私有文件,你没有追查到问题点。
  • 道歉。现在应该修复了
  • 当您第一次使用for row in p 循环遍历文件“Paldat.csv”的全部内容时,在r 上运行循环。在r 的以下循环中,您已经到达p 的末尾,因此不会从该文件中读取更多行。
  • 完美,谢谢!! - 我把p=csv.reader(...paldat.csv...) 放在for line in r 里面,它起作用了

标签: python csv for-loop


【解决方案1】:

尝试从“open”行中删除“newline='\n'”。

【讨论】:

  • 感谢您的回复。同样的事情发生了。
  • 这更像是一个评论而不是一个答案,尤其是因为它不能解决问题。
最近更新 更多