【问题标题】:Python iteration not entering if-elifPython迭代没有进入if-elif
【发布时间】:2017-03-02 17:13:33
【问题描述】:

如果这是一个非常简单的问题,请原谅我。我已经在这几个小时了。我正在尝试每行读取一个 csv 文件。但是在最后一行我不希望它附加任何“,”这就是为什么我在 if-elif 语句中分隔问题。

我不确定这是否只是我困了,但我似乎无法解决这个简单的问题。当我打印出 print (iter, row_count , iter < row_count) 时,它还没有进入任何条件,我 100% 确定最后一行是 False。

   #read csv
   data = csv.reader(open(csvFile, 'rb'), dialect='excel')

   reader = csv.reader(open(csvFile, 'r'), delimiter=",")
   tempData = list(reader)
   row_count = len(tempData)


   #geojson template
   template = \
      '''\
      {
        "type" : "Feature",
        "id" : "%s",
        "geometry" : {
            "type" : "Point",
            "coordinates" : [%s, %s]
        },
        "properties" : {
            "name" : "%s"
         }
      }
      '''

#head of geojson
output = \
    '''
{ "type" : "FeatureCollection",
    "features" : [
    '''

#loop in csv
    iter = 0

    for row in data:
        iter += 1
        print (iter, row_count , iter < row_count)
        if (iter < row_count == True):
            print("TRUE")
            id = row[0]
            name = row[1]
            latitude = row[2]
            longitude = row[3]
            output += template % (row[0], row[3], row[2], row[1])
            output += ","
            print (output)
        elif (iter < row_count == False):
            print("FALSE")
            id = row[0]
            name = row[1]
            latitude = row[2]
            longitude = row[3]
            output += template % (row[0], row[3], row[2], row[1])
            print (output)
 #tail of geojson
output += \
    '''\
    ]
}
    '''

#open geojson file to write output
outFileHandler = open(geojsonFilePath, 'w')
outFileHandler.write(output)

print("Converted to geoJSON")
outFileHandler.close()

【问题讨论】:

  • 几个小窍门:1)不要使用iter作为变量名;它已经是一个内置函数的名称,并且 2) iter &lt; row_count 已经是一个布尔值;您无需将其与 TrueFalse 进行比较。
  • 因为row_count没有初始化
  • @Ssein 它在我的代码上方某处初始化。我刚刚在这里发布了 sn-p,这是主要问题...
  • @chepner 同样适用于id - 它也隐藏了一个内置名称
  • @chepner 呵呵是的。我不应该这样做,但我尝试了所有我能做的选择

标签: python if-statement iteration conditional-statements


【解决方案1】:
iter < row_count == True

iter < row_count == False

不要做你认为他们做的事。

Python 语法允许chaining of comparisons,所以类似于

a < x < b

等价于

(a < x) and (x < b)

这是一个非常方便的功能,但它意味着你的iter &lt; row_count == True相当于

(iter < row_count) and (row_count == True)

因此,您应该将 if 语句更改为

if iter < row_count:

并将elif 更改为普通的else:

【讨论】:

    【解决方案2】:

    不要使用if,让join 为您完成工作:

    outputs = []
    for row in data:
        id = row[0]
        name = row[1]
        latitude = row[2]
        longitude = row[3]
        outputs.append(template % (row[0], row[3], row[2], row[1]))
    output = ','.join(outputs)
    

    更新:在看到你的整个 sn-p 之后,我会建议让 python 来做你的 JSON 格式?使用json.dump

    import json
    
    . . . 
    
    outputs = [{ 
        "type" : "Feature",
        "id" : row[0],
        "geometry" : {
            "type" : "Point",
            "coordinates" : [int(row[1]), int(row[2])]
        },
        "properties" : {
            "name" : row[3]
         }        
    } for row in data]
    output = {
        'features': outputs,
        'type': 'FeatureCollection',
    }
    with open(geojsonFilePath, 'w') as f:
        json.dump(output, f)
        # if you want pretty formatting, use json.dump(output, f, indent=4)
    

    【讨论】:

    • 嗯我试试这个方法
    • 感谢您的建议。我会阅读这个。另一位用户也问我为什么不使用它。我忘了那部分是一个小json。谢谢!
    【解决方案3】:

    你应该这样使用:

    (iter < row_count) == True
    (iter < row_count) == False
    

    并阅读逻辑表达式中的执行顺序

    是的,你不需要使用 False 和 True 的比较

    【讨论】:

    • PEP-8 建议您不要这样做:“不要使用 ==" 将布尔值与 True 或 False 进行比较
    • 是的,我已经将此添加到答案中,但感谢您提供 PEP8 链接
    • 是的,如果我真的想这样做,我想这是正确的方法。我确实考虑不做正确的事情@PM2Ring
    【解决方案4】:

    操作顺序。

    在 Python 中,

    >>> 1 < 2 == True
    False
    

    因为解析为(1 &lt; 2) and (2 == True)True and False

    您无需将&lt; 的结果与True 进行比较。直接用if iter &lt; row_count,应该没问题。

    此外,这不是最好的方法 - 最简单的是,在两种情况下,除了打印之外的所有内容都是相同的,因此您可以只执行打印之外的所有操作,并且只将打印放在条件句中。如果你愿意做更多的重构,其他人已经建议了其他方式。

    【讨论】:

    • 谢谢你。我会检查这是否能解决我的问题。
    【解决方案5】:

    我认为这将解决您的问题。完成数据迭代后,只需删除“,”

    for row in data:
       id = row[0]
       name = row[1]
       latitude = row[2]
       longitude = row[3]
       output += template % (row[0], row[3], row[2], row[1])
       output += ","
       print (output)
     output = output[:-1]
    

    另外,请查看enumerate()。你这样使用它

    for index, row in enumerate(data):
      <index is your iter>
      <row is the same as your loop>
    

    【讨论】:

    • 我前段时间尝试过,但没有成功。我不确定它是否是模板,或者我不记得那是我开始将它包含在条件语句中的时间。我会再试一次
    【解决方案6】:

    首先,您应该考虑row_count 的一些值,这在提供的代码中没有提及,因此您无需将其与TrueFalse 进行比较。那么,最好在执行ifelif后更改iter值

    编辑: 因此ietr 等于row_count。我认为将row_count 之类的布尔 值与整数 进行比较不是正确的方法,除非您将TRUEFALSE 定义为宏。 p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 2021-02-16
      • 2017-07-03
      • 1970-01-01
      相关资源
      最近更新 更多