我想在制表符分隔的 .csv 中写入三个变量,每次脚本迭代字典中的键值时附加值。
当前脚本调用一个命令,将标准输出正则表达式为 out
然后将三个定义的正则表达式组分配给各个变量以写入标记为 first
的 .csv second
和 third
.运行以下脚本时出现 __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)
编辑:在评论中要求发布整个回溯,注意回溯中列出的行将与上面的代码不匹配,因为这不是整个脚本。
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__
回答:使用下面的评论,我可以写成如下。
f = csv.writer(open('/mydir/ntuser.csv', 'a'),
dialect=csv.excel,
delimiter='\t')
f.writerow((first, second, rest))
最佳答案
错误很明显。 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
中被调用块您不必键入。这就是你的异常(exception)所提示的。 open
返回一个具有 __exit__
的对象正确定义,因此可以处理 with
中的正常退出和异常堵塞。 csv.writer
没有这样的方法,所以不能在with
中使用声明本身。您必须在 with
中执行此操作正如我向您展示的那样,在声明之后阻止。
关于python-2.7 - Python csv writer "AttributeError: __exit__"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35497373/