我想在一个以制表符分隔的.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__
答案 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
块中执行此操作。