【问题标题】:ignore "blank" (unfilled) row with python csv reader使用python csv阅读器忽略“空白”(未填充)行
【发布时间】:2018-06-25 17:49:42
【问题描述】:

大家。

我找不到一种 Python 方法来忽略 CSV 中的“空白”行。我使用引号是因为我说的是看起来像 '','','','','' 的行 这是一个 CSV(空白行可以是随机的):

id,name,age
1,alex,22
3,tiff,42
,,
,,
4,john,24

代码如下:

def getDataFromCsv(path):
    dataSet = []
    with open(unicode(path), 'r') as stream:
        reader = csv.reader(stream, delimiter=',')
        reader.next() # ignoring header
        for rowdata in reader:
            # how to check here?
            dataSet.append(rowdata)
    return dataSet

以下是我一直在阅读的类似问题,但与此特别不同: python csv reader ignore blank row

【问题讨论】:

  • 你可以使用if any(x for x in rowdata): dataSet.append(rowdata)
  • 顺便说一句,改成next(reader)也兼容Python3
  • 与 schwobaseggl 的 @dekim 解决方案一起工作,完全符合预期。谢谢
  • @tonypdmtr 好电话,我只是在 2.7.x 中考虑,但现在我会记住这一点。

标签: python csv reader


【解决方案1】:

您可以使用any 来检查该行中的任何列是否包含数据:

for rowdata in reader:
    # how to check here?
    if any(x.strip() for x in rowdata):
        dataSet.append(rowdata)

【讨论】:

  • 按预期工作,很清楚,它教会了我一些东西。谢谢!
  • 有用!如果我理解正确,这行if any(x.strip() for x in rowdata): 可以读作:“如果剥离行中的所有字符串值后还有任何值,则该行有数据,应该添加到数据集中”
  • 对于那些试图从行中清除空字符串的人,您是否使用了 csv.DictReader:请记住指定 x 是行字典中的值,即使用此行:if any(x.strip() for x in list(row.values())):跨度>
  • @grego "如果在删除行中的所有字符串值后还有任何值" -- 这几乎是正确的:1. ... 任何值 这不是空字符串 ... 2. any 停在第一个真实元素处,即不一定所有 元素都被剥离,但只需要尽可能多的元素。
【解决方案2】:

危险区域..也许恢复旧线程..

为什么不使用过滤器?然后我认为大型 csv 文件没有内存问题。

类似:

for data in filter(any, reader):
    print(data)

【讨论】:

    【解决方案3】:

    怎么样:

    if len(rowdata) > 0:
        dataSet.append(rowdata)
    

    或者我错过了你的问题的一部分?

    【讨论】:

    • 这不起作用,因为这些“空”行仍然是 3 长。您必须测试该行中的所有 3 个字符串是否为空。
    【解决方案4】:

    可以使用内置函数any

    for rowdata in reader:
        # how to check here?
        if not any(row):
            continue
        dataSet.append(rowdata)
    

    【讨论】:

      【解决方案5】:
      with open(fn, 'r') as csvfile:
          reader = csv.reader(csvfile)
          data = [row for row in reader if any(col for col in row)]
      
      • 打开 CSV 文件
      • 实例化 csv.reader() 对象
      • 使用列表推导:
        • 遍历 CSV 行
        • 遍历行中的列
        • 检查行中是否有任何列有值,如果有,添加到列表中

      【讨论】:

      • 嗨,欢迎来到 Stack Overflow。在回答已经有很多答案的问题时,请务必添加一些额外的见解,说明为什么您提供的回复是实质性的,而不是简单地呼应原始发帖人已经审查过的内容。这在您提供的“纯代码”答案中尤其重要。
      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      猜你喜欢
      • 2015-10-09
      • 2012-07-11
      • 2017-07-25
      • 2011-03-21
      • 2011-04-19
      • 1970-01-01
      • 2021-01-21
      • 2015-03-05
      • 2021-11-02
      相关资源
      最近更新 更多