【问题标题】:Python: Getting Errors when splitting rows of a filePython:拆分文件行时出错
【发布时间】:2014-11-22 23:49:50
【问题描述】:

我会因为一个错误而发疯的。从互联网上读取一个文件并且到目前为止我清理了内容以拥有很多这样的行: ['38', '私人', '193026', '11th', '7', '已婚公民配偶', '手艺修理', '丈夫', '白人', '男', '0' , '0', '40', '美国', '

现在我想将行的每个段拆分为一个数据集。将“38”例如转换为“Age”。 我看到我在这里有 int 和 string。此外,我想以某种方式将字符串转换为 int。

当我执行以下操作时:

for row in data_file:
    row = row.strip()
    row = row.split(",")

    try:
       row[0] = int (row [0])  #int(row(0))

    except ValueError as e:
        print (e)
    continue

我得到错误: ValueError: int() 以 10 为底的无效文字:''

如果我将 int (row [0]) 交换为 int(row(0)) 我收到错误 TypeError: 'list' object is not callable

不知怎的,我迷路了……

知道我做错了什么吗?

【问题讨论】:

  • 您需要将其设为int吗?
  • 我想是的……第一个'38'我想作为一个int。我想查看上述行中的所有值。
  • 似乎有些行在第 0 个索引处具有空值 ('')。检查以确保您的数据确实完整。如果不是,那么您可能必须捕获错误并插入默认值,或者忽略它,或者基本上以某种方式处理它
  • @AndiNeier 这些行看起来像您的示例吗?或者这只是它的列表版本?
  • 您的解析不正确。您需要从每个元素中删除引号。但是,如果任何带引号的字符串中有逗号,那么您的结果将是完全错误的。有很多可用的 Python CSV 解析示例。

标签: python list file dictionary


【解决方案1】:

如果您尝试将字符串转换为int,请确保字符串中的内容是数字。在您的情况下,似乎对于您正在解析的行之一,您在第一个位置 (row[0]) 获得了 ''(空字符串),但它失败了。

解决方法以便仅在整数对应时匹配整数,例如异常块内的continue 语句可能有效,但取决于您在这种情况下想要做什么。

【讨论】:

  • 除此之外,您还可以执行 dict(zip(myrows)) 从您的行拆分中创建一个键值对字典。
【解决方案2】:

假设示例行实际上是您上面的内容:

现在,您的列表如下所示:

row = ["['38'", " ' Private'", " ' 193026'", " ' 11th'", " ' 7'", " ' Married-civ-spouse'", " ' Craft-repair'", " ' Husband'", " ' White'", " ' Male'", " ' 0'", " ' 0'", " ' 40'", " ' United-States'", " ' <=50K']"]

基本上,您还需要剥离"["s。

或者,您可以使用 exec

exec 将字符串作为 python 代码执行。因此,这非常适合将您的行直接放入列表中。

for row in data_file:
    exec("row = "+row)
    #--------Your code----------

每一行看起来像:

39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K

您一直在以错误的顺序进行条带化和拆分。

for row in data_file:
    row = row.split(",")
    for item in row:
        item = item.strip()
    try:
        row[0] = int(row[0])
    except ValueError as e:
        print(e)
    continue

【讨论】:

  • 如果我现在包括前面提到的 exec("row = "+row) 我得到错误 row = 39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not -in-family, White, Male, 2174, 0, 40, United-Units,
  • @AndiNeier 当您发布文件的示例行时。请确保那是您的实际线路。我的回答是,如果每一行都是您在问题中发布的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 2020-08-02
相关资源
最近更新 更多