csv writer to stdout在block中抛出错误

时间:2018-04-29 20:51:16

标签: python csv stdout

如何强制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。

2 个答案:

答案 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语句中是没有意义的。
  • 使用我的python版本,您的原始with代码不起作用,我得到with open
  • 即使它有效(似乎在Python 3.6上工作,因为另一个答案已经测试过),它会关闭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")

它适用于标准输出,并且在退出时不会关闭它