0

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

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

  1. 从 Python 中,调用 grep 和 sed 并将输出通过管道传输到一个临时文件,然后可以将其提供给 csv 阅读器(呃,我想避免这个选项)

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

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

我无法控制输入文件的生成方式,因此它不是修改生成的选项。

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

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。

4

2 回答 2

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
于 2012-09-24T17:23:30.820 回答
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)
于 2012-09-24T17:18:54.950 回答