【问题标题】:Reading from csv file as an integer从 csv 文件中读取为整数
【发布时间】:2018-08-23 14:57:33
【问题描述】:

我在以整数形式从 csv 文件中读取数据时遇到了一些问题,下面是我的 csv 文件的示例:

Col1    Col2    Col3
Header  Header  Header
Header  1       1,000,000
BLANK   2       500,000
BLANK   3       200,000

我想要做的是将“Col3”中的数据(不包括标题)作为整数读入一个元组,下面是我的代码:

import csv
prizePoints = []
with open("csvfile.csv") as prizes:
    next(prizes)
    for row in prizes:
        prizePoints.append(row)

当我尝试这个时,我收到一条错误消息:

ValueError: invalid literal for int() with base 10: '"1'

打印行示例:

['', '1', '1,000,000']    

我认为这是由于 'Col3' 中的值有逗号,但是我不确定如何解决这个问题,因此我们将不胜感激! (附注:我无法更改“Col3”的单元格格式,以便它们没有逗号)。

【问题讨论】:

  • 你能不能请先做for row in csv.reader(prizes): 然后print(row) 然后break (也就是说,你可以在csv.reader()break 处理后得到一个示例行的打印输出)并给出示例行?大概您希望1,000,000 被读取为1000000 整数?
  • 嘿,我已经编辑了原始帖子以显示打印行的示例:D
  • 感谢您回复我的评论。然而,@abanert 强调了一些相当于一场完美风暴的问题——你躲避了一些子弹并击中了其他人。值得花时间一一解决这些问题。

标签: python csv writing


【解决方案1】:

这里有很多问题。

  • 在你的理解中,你是for row in prizes。由于prizes 是文件对象,因此当您处理第一行时,这会占用文件中的所有剩余行。
  • 同样的事情还从csv.reader 中隐藏了row
  • 然后您将spliting 每个row。如果csv.reader 部分正确,则该行将是一个列表,而不是一个字符串,因此没有什么可拆分的。
  • 您的 CSV 标头似乎有两行长。你不要跳过标题。您很幸运,第一个错误取消了这个错误,因此您永远不会最终尝试将标头处理为 int。
  • 然后,最后,您将尝试在1,000,000 上调用int。这个很容易解决。对于快速而肮脏的解决方案,您可以使用int(s.replace(',', '')

【讨论】:

  • 您好,感谢您的回复!抱歉,我对使用 csv 文件和 Python 还很陌生,所以我不太了解如何解决这些问题,比如当你说我不应该使用“for row in csv.reader(prizes):”时,我不知道不知道从 csv 文件中读取数据的任何其他方式
  • @Sean 但我没有说你不应该在任何地方使用for row in csv.reader(prizes):
  • 我想我只是不明白如何解决这些突出显示的问题
  • 我已经尝试了多种方法来尝试读取包含所需数据的列,但是,我无法弄清楚如何仅读取该列和数据作为与字符串相反的整数,我已经编辑了我的原始帖子以显示我尝试过的其他内容
  • 这种“快速而肮脏的解决方案”在理论上很好,但在实践中却很危险。您如何知道文件使用了哪个语言环境?它当然不是“保证是 en_US”。特别是如果该机器是可公开访问的服务器。为什么不给用户选择的权力呢?
【解决方案2】:

在解析数字时考虑使用locale 模块 - 如果您遇到某些区域切换千位和小数分隔符的问题,这将有所帮助

https://stackoverflow.com/a/2954231/66349

【讨论】:

  • 这在理论上很好,但在实践中很少有用。您如何知道该文件使用哪个语言环境?它当然不是“该脚本碰巧在其上运行的任何机器的语言环境”。尤其是如果该机器是 Windows、Mac、典型的 linux 云服务器或典型的 linux 容器美式系统,则不会设置 en_US,因此 locale.atoi 将回退到调用 int
猜你喜欢
  • 1970-01-01
  • 2014-01-07
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多