【问题标题】:python csv reader ignore blank rowpython csv阅读器忽略空白行
【发布时间】:2015-10-09 02:57:31
【问题描述】:

我正在使用 pythons csv 阅读器。如何以忽略空行的方式使用以下代码。

import csv
f1 = open ("ted.csv")
oldFile1 = csv.reader(f1, delimiter=',', quotechar='"')
oldList1 = list(oldFile1)
f2 = open ("ted2.csv")
newFile2 = csv.reader(f2, delimiter=',', quotechar='"')
newList2 = list(newFile2)

f1.close()
f2.close()

with open("ted.csv") as f1, open("ted2.csv") as f2, open('foo.csv', 'w') as out:
     r1, r2 = csv.reader(f1), csv.reader(f2)
     st = set((row[0], row[3]) for row in r1)
     wr = csv.writer(out)
     for row in (row for row in r2 if (row[0],row[3]) not in st):
           wr.writerow(row)

【问题讨论】:

  • 您的 csv 文件实际上是什么样的?您可以在几个示例行中进行编辑,包括空白行吗?另外,您得到的具体错误是什么,Python 是否引发异常或者您只是没有得到您想要的结果?
  • csv 中的第一行是空行。我得到的错误是 IndexError: list index out of range。如果我手动删除第一个空行并运行,我不会收到任何错误。

标签: python csv python-3.x blank-line


【解决方案1】:

如果你的空格总是在第一行,那么 Marius 的答案是最简单的。如果您在开头有n 空白,或者您只是想跳过一些行,您可以使用itertools.islice()。

跳过前 N 行

假设您想跳过前4 行(空白行与否):

from itertools import islice
with open('csv2.csv', 'r') as f1, open('out.csv', 'w') as out:
    filt_f1 = islice(f1, 4, None)
    r1 = csv.reader(filt_f1)
    wr = csv.writer(out)
    for line in r1:
        ...

全是空白线

如果您的文件中散布着空白行,那么您可以使用itertools.filterfalse 将它们过滤掉。

import csv
from itertools import filterfalse
from itertools import chain

with open('csv1.csv', 'r') as f1, open('csv2.csv', 'r') as f2, open('out.csv', 'w') as out:
    # create an iterator without lines that start with '\n'
    filt_f1 = filterfalse(lambda line: line.startswith('\n'), f1)
    filt_f2 = filterfalse(lambda line: line.startswith('\n'), f2)

    # csv.reader consumes the filtered iterators
    r1, r2 = csv.reader(filt_f1), csv.reader(filt_f2)
    wr = csv.writer(out)

    # here insert your logic, I just write both to the same file
    for line in chain(r1, r2):
        wr.writerow(line)

csv1.csv 在哪里:

time,name,location
12345,Jean,Montreal

12346,Peter,Chicago

1234589,Doug,Boston

和 csv2.csv(注意:此处未显示,但 csv2.csv 在文件顶部有 4 个空白行):

123457,Scott,San Diego

123458,Jen,Miami

123459,Robert,Sacramento

output out.csv 始终没有空行:

time,name,location
12345,Jean,Montreal
12346,Peter,Chicago
1234589,Doug,Boston
123457,Scott,San Diego
123458,Jen,Miami
123459,Robert,Sacramento

【讨论】:

    【解决方案2】:

    如果您的 csv 文件以空行开头,我认为您应该能够在创建 csv 阅读器之前使用 readline() 跳过该行:

    with open("ted.csv") as f1, open("ted2.csv") as f2, open('foo.csv', 'w') as out:
        f1.readline()
        f2.readline()
        r1, r2 = csv.reader(f1), csv.reader(f2)
    

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 2017-07-25
      • 2011-04-19
      • 1970-01-01
      • 2021-01-21
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      相关资源
      最近更新 更多