Python csv writer“AttributeError:__ exit__”issue

时间:2016-02-19 04:33:46

标签: python-2.7 csv

我想在一个以制表符分隔的.csv中编写三个变量,每次脚本迭代字典中的一个键值时附加值。

目前,脚本调用命令,将stdout正则表达为out,然后将三个定义的正则表达式组分配给各个变量,以便写入.csv标记为first second和{{1} }。运行以下脚本时出现__exit_错误。

/注意我已经阅读了csv.writer,我仍然对是否可以将多个变量实际写入一行感到困惑。

感谢您提供的任何帮助。

third

编辑:请求在评论中发布整个回溯,请注意回溯中列出的行与上述代码不匹配,因为这不是整个脚本。

 import csv, re, subprocess

 for k in myDict:
     run_command = "".join(["./aCommand", " -r data -p ", str(k)])
     process = subprocess.Popen(run_command,
                                shell=True,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
     out, err = process.communicate()
     errcode = process.returncode
     pattern = re.compile('lastwrite|(\d{2}:\d{2}:\d{2})|alert|trust|Value')
     grouping = re.compile('(?P<first>.+?)(\n)(?P<second>.+?)([\n]{2})(?P<rest>.+[\n])', 
                           re.MULTILINE | re.DOTALL)


    if pattern.findall(out):         
        match = re.search(grouping, out)
        first = match.group('first')
        second = match.group('second')
        rest = match.group('rest')

     with csv.writer(open(FILE, 'a')) as f:
        writer = csv.writer(f, delimiter='\t')
        writer.writerow(first, second, rest)

答案:使用以下评论我可以写如下。

Traceback (most recent call last):
File "/mydir/pyrr.py", line 60, in <module>
run_rip()
File "/mydir/pyrr.py", line 55, in run_rip
with csv.writer(open('/mydir/ntuser.csv', 'a')) as f:
AttributeError: __exit__

1 个答案:

答案 0 :(得分:6)

错误很清楚。 with语句采用上下文管理器,即具有__enter____exit__方法的对象,例如open返回的对象。 csv.writer没有提供这样的对象。您还尝试两次创建作者:

with open(FILE, 'a') as f:
    writer = csv.writer(f, delimiter='\t')
    writer.writerow(first, second, rest)

with ... f:就像try...except...finally一样,保证f无论发生什么都会被关闭,除非你不必输入它。 open(...)返回一个上下文管理器,在__exit__块中调用finally方法,您不必键入。这就是你的例外所抱怨的。 open返回一个正确定义__exit__的对象,因此可以处理with块中的正常退出和异常。 csv.writer没有这样的方法,因此您无法在with语句本身中使用它。正如我向您展示的那样,您必须在声明后的with块中执行此操作。