我不小心安装了64和32位python 2.7.8,现在它的行为很奇怪

时间:2014-09-27 01:12:22

标签: python python-2.7

糟糕。

之后我卸载了两个pythons并重新下载了32位。

现在我试图在PowerShell中启动python后打开一个test.txt文件,它给了我这个

>>> open('C:/test/test.txt')
<open file 'C:/test/test.txt', mode 'r' at 0x021CB7B0> 

>>> open('C:/test/test.txt')
<open file 'C:/test/test.txt', mode 'r' at 0x021CB758>

>>> open('C:/test/test.txt')
<open file 'C:/test/test.txt', mode 'r' at 0x021CB7B0>

>>> open('C:/test/test.txt')
<open file 'C:/test/test.txt', mode 'r' at 0x021CB758>

并且它继续交替而根本不打开文本文件。

Windows PowerShell上的python -v也给了我:

enter image description here

如何修复我的python?

2 个答案:

答案 0 :(得分:3)

这是Python对象(包括file返回的open个对象)的普通行为。它与垃圾收集有关,与您遇到的安装问题无关。

当您致电open时,会创建一个新的file对象。文本<open file 'C:/test/test.txt', mode 'r' at 0x021CB7B0>是文件对象的repr。之后,当对象将被垃圾收集。稍后,当您创建另一个新对象时,可以重用第一个对象的内存。这就是为什么你可以多次看到相同的内存地址。

你看到两个地址交替的原因有点微妙。当您以交互模式运行Python解释器时,它会打印您在提示符处键入的任何表达式的值的repr(仅跳过None)。它还将最近打印的值存储在变量_(单个下划线)中。这意味着每次打开该文件时,返回的file对象都会在短时间内绑定到_。当您创建下一个file对象时,它会替换_中的第一个对象,并且旧文件会被垃圾收集(因为它不会被代码的任何其他部分引用)。

当您创建第三个文件时,它会重复使用第一个文件的内存,因为它现在是免费的。它再次重新绑定_,因此第二个文件对象被垃圾收集。现在,当您创建第四个文件时,它会重用第二个文件中的内存。如果你要继续创建和销毁文件对象(中间没有做任何其他事情),交替的内存地址将无限期地继续。

如果您的代码编写方式略有不同,您会得到不同的结果。例如,如果在创建它之后将每个新打开的file对象附加到列表中,它们都会得到不同的内存地址(因为它们同时存在于内存中)。

file_objects = []
for i in range(5):
    file_objects.append(open('C:/test/test.txt'))
print file_objects

然而,虽然这说明了正在发生的事情,但听起来你真正想要的是打开并阅读文件的内容。为此,您需要在read的文件对象上调用open方法。最佳做法是使用调用open作为with语句的一部分,因为这可确保文件在完成后再次关闭:

with open('C:/test/test.txt') as f:  # open the file, bind the file object to name f
    text = f.read()                  # read the file contents into text
                                     # the file is closed when the indented block ends
print text                           # print the contents read from the file

答案 1 :(得分:0)

嗯,这是缩进的结果。 open()会返回file-object

如果您想阅读内容,那么您可以使用

open(r'C:\test\test.txt').read()

但是使用这样的东西会更好,

with open(r'C:\test\test.txt') as f:
    print f.read();