如何强制csv.writer()
用块接受stdout?
我的工作正常:
with (open(output, "w")) if output != 'stdout' else stdout as file:
这也没关系:
file = csv.writer(open(output, "w") if output != 'stdout' else stdout)
但是当我尝试这个时:
with csv.writer(open(output, "w") if output != 'stdout' else stdout) as file:
我得到AttributeError: __exit__
如何使用块工作呢?我正在寻找像ruby solution这样的解决方案,但是对于python。
答案 0 :(得分:2)
稍微改写:
import csv
from sys import stdout
#output = "temp.txt"
output = "stdout"
with (open(output, "w") if output != 'stdout' else stdout) as file:
writer = csv.writer(file)
writer.writerow(["A","B","C"])
至少适用于Python 3.6。
但是...... 这将在with block完成后关闭stdout。
例如:
with (open(output, "w") if output != 'stdout' else stdout) as file:
writer = csv.writer(file)
writer.writerow(["A","B","C"])
print("AFTER") # Raises "ValueError: I/O operation on closed file."
我认为最好的方法就是直接处理文件关闭。你确实失去了上下文管理器在异常时自动关闭文件的好处,但没有做一些额外的工作来创建一个实际上并未在__exit__
关闭的pseduo-stdout,你最好的选择可能是:
import csv
from sys import stdout
#output = "temp.txt"
output = "stdout"
file = (open(output, "w") if output != 'stdout' else stdout)
writer = csv.writer(file)
writer.writerow(["A","B","C"])
if output != "stdout": file.close()
print("AFTER")
答案 1 :(得分:2)
malloc()
不必在退出时关闭句柄。因此没有csv.writer
方法,将__exit__
放在csv.writer
语句中是没有意义的。with
代码不起作用,我得到with open
AttributeError: __exit__
。不是你想要的。我用stdout
和__enter__
(什么都不做)方法创建了一个“假”文件对象。此对象符合__exit__
约束。
with
此代码打印:
import csv,sys
output="stdout"
class FakeStdout:
def write(self,data):
sys.stdout.write(data)
def __exit__(self,*args,**kwargs):
pass
def __enter__(self):
return self
with (open(output, "w") if output != 'stdout' else FakeStdout()) as file:
cw = csv.writer(file)
cw.writerow([1,2,3])
print("lll")
它适用于标准输出,并且在退出时不会关闭它