在Python 3如何重写file.write()?

下面的代码工作了Python 2.6,但没有关于Python 3.x的:

old_file_write = file.write class file(): def write(self, d): if isinstance(d, types.bytes): self.buffer.write(d) else: old_file_write(d) # ... some code I cannot change or do not want to change f = open("x") f.write("...") f.write(b"...") sys.stdout.write(b"...") sys.stdout.write("...") print(b"...") print("...")

问题是,在Python 3.x中的第一行就会产生一个错误:

NameError: name 'file' is not defined

我怎样才能使这项工作在Python 3.x的?

事实上,两年后,我还在寻找,将工作的两个版本(2.5+,和3.x)的解决方案。

对于那些谁仍然不知道为什么我找的这一点,仅仅是为了能够使旧的代码(别人的代码,有时你不能修改)具有较新版本的Python工作。

这不是我的代码,它是关于你怎么能写一些代码,发挥很好地与恶意代码:)

--------------解决方案-------------

我看到两个问题。

1:您的file类不是从任何特定的类继承。 如果我正确解释的情况下,它应该是一个子类io.TextIOWrapper

2:在这两个的Python 2.6和3.x,该types模块(这需要首先要导入)没有元素bytes 。 推荐的方法是只使用bytes自己。

重做片段:

import io, sys

class file(io.TextIOWrapper):
def write(self, d, encoding=sys.getdefaultencoding()):
if isinstance(d, bytes):
d = d.decode(encoding)
super().write(d)

old_stdout = sys.stdout # In case you want to switch back to it again

sys.stdout = file(open(output_file_path, 'w').detach()) # You could also use 'a', 'a+', 'w+', 'r+', etc.

现在应该做你想要它,使用sys.stdout.write到您指定输出文件。 (如果您不希望写入到磁盘上的文件,而是希望写到默认的sys.stdout缓存,使用sys.stdout = file(sys.stdout.detach())可能会工作。)

请注意,因为Python 3.X没有file类,但2.6确实有io模块,你将不得不使用的类中的一个io模块。 我上面的代码只是一个例子,如果你希望它是更灵活的,你必须要继续的在你自己。 也就是说,这取决于什么样你写的文件/你写在什么模式下,你可能会想在使用不同的类io

old_file_write = file.write

您正在使用的类级别的方法, file类。

old_file_write(d)

不应该工作。 我相信你还是复制和粘贴不正确。

我想你可能有

old_file_write(self,d)

这可能会奏效。

你的方法是不是很好。 想想这个吧。

class MyKindOfFile( file ):
def write(self, d):
if isinstance(d, types.bytes):
self.buffer.write(d)
else:
super( MyFindOfFile, write )(d)

这将更好地工作了很多适合你,因为它使用简单的继承更典型方式。

file对象可以写字节,但你必须在正确的模式打开文件

fp = open('file.bin', 'wb') # open in binary mode
fp.write(b"some bytes")
pf.close()

如果你想要写字符串到磁盘,你需要将它们先进行编码。

分类:蟒蛇 时间:2015-03-15 人气:0
本文关键词: 蟒蛇,蟒蛇3.X
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.238 (s). 10 q(s)