2012-09-24 130 views
0

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

目前,我已发现3个选项用于移除所述文本:

  1. 从Python中,调用grep和sed和管道输出到随后可被馈送到CSV读者 一个临时文件(唉,我想避免这个选项)

  2. 创建一个CSV方言删除不需要的文本 (此选项只是觉得不妥)

  3. 扩展文件对象,implementi下一个()函数根据需要删除不需要的文本。

我有过是如何产生的输入文件无法控制,所以它不是修改生成的选项。

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

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。

+0

如果你的“真实”的线是等长的,你可以比较一下'LEN()',然后切片。 –

+0

@BurhanKhalid,你在哪里建议我添加这个逻辑? – Brady

回答

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 
+0

好吧,那么这只是一个简单的写filter_line()函数的情况? – Brady

+0

@布雷迪:是的。 [](h) – jfs

+0

太棒了,这是一个简单而优雅的解决方案。这就是为什么我非常喜欢Python的原因:)谢谢! – Brady

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) 
+0

去除不需要的文本的逻辑去哪里?考虑到你有'mycsv',我是否也必须用这个解决方案修改/扩展csv? – Brady

+0

嗯,是你实现自己的CSV阅读器。 –