【问题标题】:KeyError when trying to use Python to select rows with a particular range of values in one column尝试使用 Python 选择一列中具有特定值范围的行时出现 KeyError
【发布时间】:2014-07-11 17:57:19
【问题描述】:

所以我在这个帖子中找到了我的问题的大部分解决方案:Use Python to select rows with a particular range of values in one column

但是在实现代码时,我遇到了一个我无法弄清楚的错误。我正在尝试仅从花旗自行车数据中提取订阅者的数据行(此处的信息:http://www.citibikenyc.com/system-data

代码如下:

import csv

with open("E:/Dropbox/PPS/CitiBikeData/2014_Data.csv") as input, open("E:/Dropbox/PPS/CitiBikeData/subscribers.csv", "w") as output:
   reader = csv.DictReader(input, dialect="excel-tab")
   fieldnames = reader.fieldnames
   writer_output = csv.DictWriter(output, fieldnames, dialect="excel-tab")
   writer_output.writeheader()
   for row in reader:
       if int(row['gender']) > 0:
          writer_output.writerow(row)

这是我得到的错误:

C:\Python34\python.exe E:/Dropbox/PPS/CitiBikeData/csvfilter_2.py
Traceback (most recent call last):
  File "E:/Dropbox/PPS/CitiBikeData/csvfilter_2.py", line 9, in <module>
    if int(row['gender']) > 0:
KeyError: 'gender'

Process finished with exit code 1

我了解 KeyError 是什么(通过阅读此 https://wiki.python.org/moin/KeyError),但我不知道为什么会收到错误,或者如何解决它。

【问题讨论】:

  • 澄清一下,我在代码中使用了性别,因为任何非订阅者都被编码为0,我认为使用整数会比字符串更好。
  • print row.keys() 说什么?
  • dict_keys(['tripduration,"starttime","stoptime","起始站id","起始站名","起始站纬度","起始站经度","结束站id ","终点站名称","终点站纬度","终点站经度","bikeid","usertype","出生年份","性别"'])
  • 我下载的文件不是制表符分隔。你有一个键。注意键周围的单引号。

标签: python csv


【解决方案1】:

您下载的数据不是制表符分隔。您使用了错误的 CSV 方言来打开它。

去掉dialect参数,默认(逗号分隔)格式就可以了:

>>> import csv
>>> f = open("/tmp/2013-07 - Citi Bike trip data.csv")
>>> reader = csv.DictReader(f)
>>> next(reader)
{'bikeid': '16950', 'tripduration': '634', 'end station longitude': '-73.98165557', 'stoptime': '2013-07-01 00:10:34', 'end station name': '1 Ave & E 15 St', 'gender': '0', 'start station name': 'E 47 St & 2 Ave', 'start station longitude': '-73.97032517', 'start station id': '164', 'start station latitude': '40.75323098', 'end station id': '504', 'starttime': '2013-07-01 00:00:00', 'end station latitude': '40.73221853', 'birth year': '\\N', 'usertype': 'Customer'}
>>> _['gender']
'0'

由于gender 列是'0''1''2',在这种情况下,您可以简单地测试不等于'0' 并为自己节省一个int() 调用:

writer_output.writerows(row for row in reader if row['gender'] != '0')

这使用生成器表达式将所有过滤的行传递给DictWriter.writerows()(复数)。

【讨论】:

  • 谢谢。我一直在关注简单的事情。
猜你喜欢
  • 2018-09-10
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多