【问题标题】:Accessing unicoded keys with spaces in them in Python 2.7在 Python 2.7 中访问带有空格的 unicode 键
【发布时间】:2013-03-02 00:39:18
【问题描述】:

我正在做一个项目,我正在尝试获取 Excel 文件(通过 xlrd 读取)并在其中对地址进行地理编码。为此,我使用了一个目录列表,每个目录条目都是一个单独的站点。

addressList[0] 之类的内容将导致以下结果:

{text:u'First name ': u'John',
 text:u'Site City': u'Indio',
 text:u'Site State': u'CA',
 text:u'Last name': u'Doe',
 text:u'Site Phone': u'760-555-1234',
 text:u'Site Zip': u'92201',
 text:u'Site Address1': u'1313 Mockingbird Lane',
 text:u'Site Name': u'Tyrell Industries',
 text:u'Hours': u'Mon-Fri 12:00-1:00',
 text:u'Affliation': u'Boys & Girls Clubs of America'}

(我刚刚在电子表格中意识到,“affiliation”拼写错误。嗯。)

现在,我环顾四周,知道keys in Python can have spaces in them,这应该不是问题。但是输入 addressList[0]['Site Phone'] 会导致 KeyError。事实上,尝试获取 'Hours' 键的值会导致类似的 KeyError。

基于question on Unicode keys,我尝试了以下方法:

STRING_DATA = dict([(str(k), v) for k, v in addressList[0].items()])

这导致字典中的条目如下:

"text:u'Site Name'": u'Tyrell Industries',

这还不错,只是我现在必须通过STRING_DATA["text:u'Site Name'"] 访问该值,这似乎很痛苦。

有没有更快/更简单的方法来使用这些键?

【问题讨论】:

  • 我不明白该数据结构应该是什么。这些“文本”前缀来自哪里?你是如何接收它的,你是如何输出它的?
  • 我通过使用xlrd.workbook_open 打开工作簿来获取数据,然后通过创建列表并附加字典来读取数据:addressList.append(dict(zip(column_names, siteSheet.row_values(rownum)))) 其中column_names 是从第一行获得的床单。 ('text:u' 前缀会自动添加。)

标签: python xlrd dictionary python-unicode


【解决方案1】:

text:u'First name ': u'John', 不是有效的 dict 条目。

您在 text:u'First Name' 这样的键之前有 text: 前缀的原因是,因为您使用 xlrd cells 作为 dict 的键。

您应该使用cell.value从单元格中显式提取值

类似:

new_keys = [k.value for k in addresslist[0]]

【讨论】:

  • 当我从 Excel 文件中读取字段名称时,使用 cell_value 效果很好。类似:for i in range(NUMBER_OF_COLUMNS): column_names.append(site_sheet.cell_value(0, i)) 给了我可以毫无问题地引用的密钥。谢谢!
【解决方案2】:

所有你应该需要得到你的列标题是这样的:

column_names = site_sheet.row_values(rowx=0, end_colx=NUMBER_OF_COLUMNS)

但是,标题似乎需要稍微擦洗一下,例如u'First name 'u'Last name' 可以与其他标题一致,方法是删除前导和尾随空格并强制标题大小写:

column_names = [x.strip().title()
    for x in site_sheet.row_values(row=0, end_colx=NUMBER_OF_COLUMNS)]

【讨论】:

  • 谢谢。我是从第三方来源获得的,所以我知道我仍然可以做一些清理工作。但主要问题是当工作表中的值时我可能不应该做的事情。
猜你喜欢
  • 2018-09-28
  • 2017-08-18
  • 2018-09-10
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多