在python中,有没有一种方法可以同时计算两个案例的大小写?

在python中,有没有一种方法可以同时计算两个案例的大小写?,python,csv,classification,Python,Csv,Classification,我试图对一个包含21列和大量行的数据集进行分类。我已经到了可以将数据作为csv导入并打印出单独列的地步。我还有两件事要做。首先,我希望能够打印出特定的数据点。例如,位于第2行第4列的数据点。第二项任务是根据第4列和第5列对数据行进行分类。这些列是纬度和经度。我正在尝试获取世界某个特定地区的行。所以我的想法是这样的 if 60 > row[4] > 45 and 165 > row[1] > 150: ie(就像数学运算(9>x>5)) 我不确定做上述程序的正确方法是什

我试图对一个包含21列和大量行的数据集进行分类。我已经到了可以将数据作为csv导入并打印出单独列的地步。我还有两件事要做。首先,我希望能够打印出特定的数据点。例如,位于第2行第4列的数据点。第二项任务是根据第4列和第5列对数据行进行分类。这些列是纬度和经度。我正在尝试获取世界某个特定地区的行。所以我的想法是这样的

if  60 > row[4] > 45 and 165 > row[1] > 150:
ie(就像数学运算(9>x>5))

我不确定做上述程序的正确方法是什么

我已将代码粘贴到底部。我是python编程新手,所以请随意指出错误

import csv
path = r'C:\Documents and Settings\eag29278\My Documents\python test code\test_satdata.csv'
with open(path, 'rb') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        print row [0]
        #this prints out the first column 

    var1 = []

    for row in f:

       if  60 > row[4] > 45 and 165 > row[1] > 150:

          var1.append(row)

print var1
更新1

好的,我更新了代码,但是当我运行模块时,我得到了这个输出

2010年 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 []


因此,我看到程序输出了var1,但它是空的,在Python中实际上可以正常工作。大多数其他语言都不允许你这么做;您必须写入
60>第[4]行和第[4]>45行和…

您通常会使用以下目录中的
来编写它:


比较可以任意链接,例如,
x=
中的
。有一个隐式的

您可以在这里使用列表

var1 = [row for row in f if 45 < row[4] < 60 and 150 < row[1] < 165]
var1=[如果45
我同意乔恩的观点。使用

更自然地阅读这一行:

if  60 > row[4] > 45 and 165 > row[1] > 150:
正在比较
60>[行中的第五个字符,作为字符串]>45…
。我猜那不是你想要的<代码>对于f中的行
为文件中的每一行生成一个字符串。我想你是想在做这些比较之前做一些分析。或者,您可能想在
阅读器
上迭代,而不是
f
f
是文件本身,而不是csv阅读器

这应该更好地发挥作用:

with open(path, 'rb') as f:
    reader = csv.reader(f, delimiter=',')
    var1 = [] # This is a very poorly named variable, by the way.
    for row in reader:
        print row [0]
        if  60 > row[4] > 45 and 165 > row[1] > 150:
            var1.append(row)
所有关于“链式比较”(例如
60>foo>45
)的答案都完全没有抓住要点。你没有链式比较的问题。但是你的代码中有很多问题

首先,CSV读取器返回的行总是以字符串作为元素。所以如果CSV看起来像

10,20,abc,40
在Python中,当您使用CSV读取器时,它会变成

['10', '20', 'abc', '40']  # list of strings
在Python2中,将字符串与数字进行比较在某种意义上是“可行的”,并且不会引发任何异常。但这通常不是你想要的。例如:

Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 < '2'
True
>>> 2 < '1'
True
您要做的是将每行的第5个字符与60和45进行比较,并将每行的第2个字符与165和150进行比较。你几乎肯定是说

var1 = []
for row in reader:
    if 60 > int(row[4]) > 45 and 165 > int(row[1]) > 150:
        var1.append(row)
但不幸的是,这还不是全部。您已经“用完”了CSV中的所有行

for row in reader:
    print row [0]
在循环结束时,
reader
没有更多的行可读取。最简单的方法是重新打开文件,并为每个循环使用新的读取器:

with open(path, 'rb') as f:
    reader = csv.reader(f, delimiter=',')  # why specify the delimiter?
    for row in reader:
        print row[0]
        #this prints out the first column 

with open(path, 'rb') as f:  # we open the file a second time
    reader = csv.reader(f)
    var1 = []
    for row in f:
        if 60 > int(row[4]) > 45 and 165 > int(row[1]) > 150:
            var1.append(row)
对于初学者,甚至是最有经验的Python程序员,这就足够了。代码清晰到显而易见的程度,这通常是一件好事。如果特殊情况要求采取更高级的措施,请查看这些过去的问题,寻找可能的替代方案:


9>x>5
在python中运行良好。看起来您的代码应该完全按照您的要求执行。那么…你有问题吗?如果您只想查看工作代码,请使用,而不是堆栈溢出。我猜code review是一个专门用于故障排除的站点,那么对于f
中的行,
将为每一行生成一个
str
对象,因此不会追加任何行
60>‘foo'>45
在Python中不会引发异常——它只会返回False。@erik.garcia294不,CodeReview是用于有工作代码时,但您认为它可以编写得更干净或运行得更快。@JonClements:稍微更改了措辞。我现在知道我不应该使用f,有没有一个替代方案,可以产生一些东西,可以给我一个输出。。。有人建议在reader中使用此行作为行,但我仍然得到相同的输出。更多解析是什么意思?在这种情况下,解析意味着将字符串强制为int。如果在csv读取器上迭代,可能需要执行类似于
int(第[4]行]
的操作;如果在f.Hmm上迭代,则可能需要执行
int(line.split(',')[4])
的操作。您指出了几个问题:(1)CSV元素始终是字符串,(2)字符串不一定以有用或直观的方式与整数进行比较,(3)OP似乎对文件和CSV读取器之间的区别感到困惑。但是,您的代码片段无法修复(1)或(2)。这个答案虽然提供了正确的信息,但对解决OP的真正问题毫无帮助。首先,感谢您抽出时间帮助我。我确实执行了您的建议,但在执行代码回溯(上次的最新调用)的一半时间里,我收到了这个错误:文件“C:\Python27\test code\12345.py”,第9行,if 60>int(第[3]行]>45和165>int(第[4]行)>150:ValueError:int()的文本无效,以10为底:“8.67”1在我打印时收到一个空变量的剩余时间,
var1 = []
for row in f:
   if  60 > row[4] > 45 and 165 > row[1] > 150:
      var1.append(row)
var1 = []
for row in reader:
    if 60 > int(row[4]) > 45 and 165 > int(row[1]) > 150:
        var1.append(row)
for row in reader:
    print row [0]
with open(path, 'rb') as f:
    reader = csv.reader(f, delimiter=',')  # why specify the delimiter?
    for row in reader:
        print row[0]
        #this prints out the first column 

with open(path, 'rb') as f:  # we open the file a second time
    reader = csv.reader(f)
    var1 = []
    for row in f:
        if 60 > int(row[4]) > 45 and 165 > int(row[1]) > 150:
            var1.append(row)