Python csv编写器"AttributeError:__ exit__"问题

ImN*_*eet 4 csv python-2.7

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

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

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

感谢您的任何帮助,您可以提供.

 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)
Run Code Online (Sandbox Code Playgroud)

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

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__
Run Code Online (Sandbox Code Playgroud)

答:使用以下评论,我能够写如下.

f = csv.writer(open('/mydir/ntuser.csv', 'a'),
                       dialect=csv.excel,
                       delimiter='\t')
f.writerow((first, second, rest))
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 6

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

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

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