向Python CSV阅读器添加逻辑

时间:2012-09-24 17:12:46

标签: python csv

我正在尝试使用python CSV阅读器解析“伪CSV”文件,并且对如何添加一些额外逻辑有一些疑问。我称之为“伪CSV”文件的原因是因为输入文件中 某些 的行在实际CSV数据之前会有文本(30-40个字符)开始。我想找出删除此文本的最佳方法。

目前,我找到了3个删除所述文字的选项:

  1. 从Python中调用grep和sed并将输出传递给临时文件,然后将其输入到csv阅读器  (呃,我想避免这个选择)

  2. 创建CSV方言以删除不需要的文字  (这个选项感觉不对)

  3. 扩展File对象,实现next()函数以根据需要删除不需要的文本。

  4. 我无法控制输入文件的生成方式,因此不能修改生成。

    这是我在意识到输入文件出现问题时的相关代码。

    with open('myFile', 'r') as csvfile:
    theReader = csv.reader(csvfile)
    for row in theReader:
         # my logic here
    

    如果我选择上面的选项3,解决方案非常简单,但是 然后我将无法合并with open()语法。

    所以,这是我的问题(实际上是2个):选项3是解决此问题的最佳方法 问题?如果是这样,我如何将其与with open()语法合并?

    编辑 :忘记提及我在Linux上使用Python 2.7。

2 个答案:

答案 0 :(得分:4)

除了文件之外,

csv.reader接受任意迭代:

with open('myFile', 'rb') as csvfile:
     reader = csv.reader(filter_line(line) for line in csvfile)
     for row in reader:
         # my logic here

答案 1 :(得分:0)

您可以使用contextlib并创建自己的上下文管理器。

from contextlib import contextmanager

@contextmanager
def csv_factory(filename, mode="r"):
    # setup here
    fileobj = open(filename, mode)
    reader = mycsv.reader(fileobj)
    try:
        yield reader # return value for usage in with 
    finally:
        fileobj.close() # clean up here


with csv_factory("myFile") as csvfile:
    for line in csvfile:
        print(line)