【问题标题】:Need help filtering out incomplete entries in a .csv [Python]需要帮助过滤掉 .csv [Python] 中不完整的条目
【发布时间】:2014-08-26 07:25:37
【问题描述】:

我有一组数据点,如下所示:

ID 70014 1940 1 1 26.8 1 是

ID 70014 1940 1 2 29.8 1 是

ID 70014 1940 1 3 34.3 1 是

ID 70014 1940 1 4 35.7 1 是

ID 70014 1940 1 5 34.1 1 是

但有些条目有缺失值,如下所示:

ID 70014 1940 6 30
编号 70014 1940 7 1 14 1 N

我需要使用 def 函数来设置合法条目的参数,然后将它们过滤掉,但我不确定如何去做。我对它应该在我的代码中的位置感到困惑,我很确定我知道如何描述参数,但不知道如何将此代码连接到我的程序的其余部分。

如果我遗漏了什么,请告诉我,我很乐意更彻底地描述这个问题:)

干杯。

【问题讨论】:

  • @greole 我基本上是在尝试使用 if 函数来声明条目何时应出现为 False,例如: dec accept_entry(entry) if (column3 == "") return False if (column7 != "Y") return False return True 但我有点卡在这里,不知道如何让它跳过一个 False 条目。
  • 如果您只是发布代码和到目前为止遇到的错误,那么帮助您会容易得多。
  • 您已经声明像这样的行:ID 70014 1940 7 1 14 1 N 是缺失值。然而,事实并非如此。它具有正确数量的值 (8)。我错过了什么吗?
  • 其中一个参数是第 8 列是 Y。其他的都是 False。抱歉,我应该提到还有其他参数,第一个只是我想到的第一个示例...dropbox.com/s/ngkp7m71x4msdqw/Temperature%20Code.py?dl=0
  • 是的,您可以将代码的相关部分直接放在您的问题中

标签: python csv filter


【解决方案1】:

如果有足够的字段,您可以做的最简单的事情是拆分字符串并计数:

def is_valid_ID(Id):
   if len(Id.split()) == 8:
       return True
   else:
       return False

 >>>is_Valid_Id("ID 70014 1940 1 1 26.8 1 Y")
 True
 >>>is_Valid_Id("ID 70014 1940 1 1 26.8 1")
 False

但是,这不会检查单个元素是否有效(您可以为此使用正则表达式)。

或者用更紧凑的符号表示相同的东西

def is_valid_ID(Id):
    return (True if len(Id.split()) == 8 else False)

如果你想使用正则表达式,你可以尝试

 import re

 def accept_entry(entry):
     try:
         return re.search("ID [0-9]{5} [0-9]{4} [0-9] [0-9] [0-9.]* [0-9] Y",entry).group()
     except:
         return False

【讨论】:

  • 非常感谢 def 应该进入'for entry'循环吗?我已经按原样运行代码,def 在底部,python 告诉我变量“尚未定义”。
  • 就在您的if __name__ == "__main__" 行之前
  • 太棒了,你帮助我让它按应有的方式工作。我在使用一些相关语法时遇到了问题,你的帖子让我想起了我做错了什么,谢谢一百万!
  • 无需感谢我,如果解决方案对您有用,接受答案是最好的选择;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2010-12-26
  • 2013-07-06
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多