Python打开和读取文件一个班轮

时间:2015-02-23 18:22:22

标签: python python-2.7 python-3.x

我知道提交阅读/写作的最佳方式是使用with

而不是使用

f = open('file.txt', 'w')
f.write('something')
f.close()

我们应该写 -

with open('file.txt', 'w') as f:
    f.write('something')

但如果我想简单地阅读文件怎么办?我可以这样做

with open('file.txt') as f:
    print (f.read())

但下面一行有什么问题

print (open('file.txt').read())

OR

alist = open('file.txt').readlines()
print (alist)

执行此语句后会自动关闭文件吗?这是一种标准的写作方式吗?我们应该这样写吗?

除此之外 - 我应该在函数中打开一个文件并将指针传递给其他用于写入,还是应该将其声明为全局变量?即

def writeto(f):
    #do some stuff
    f.write('write stuff')

def main():
   f = open('file.txt', 'w')
   while somecondition:
        writeto(f)
   f. close()

OR

f = open('file.txt', 'w')

def writeto():
    #do some stuff
    f.write('write stuff')

def main():
   while somecondition:
        writeto()

f. close()

2 个答案:

答案 0 :(得分:3)

按顺序解决问题,

" print(open(file).readlines())出了什么问题?"

好吧,你在使用它之后丢弃文件对象,所以你不能close它。是的,Python最终会自动关闭你的文件,但是它的条款而不是你的。如果您只是在shell或终端中玩游戏,这可能很好,因为您的会话可能很短,并且通常不会对文件进行任何资源竞争。但是,在生产环境中,在脚本的生命周期内保持打开文件句柄可能会对性能产生破坏性。

就创建一个带有文件对象并写入文件对象的函数而言,这基本上就是file.write。考虑文件句柄是带有方法的对象,幕后的那些方法将self(即对象)作为第一个参数。所以写本身已经是一个带文件句柄并写入它的函数!您可以根据需要创建其他功能,但基本上复制默认行为没有任何实际好处。

请考虑您的第一个函数看起来像这样:

def write_to(file_handle, text):
    return file_handle.write_to(text)

但是,如果我将file_handle self命名为

,该怎么办?
def write_to(self, text):
    return self.write(text)

现在它看起来像一个方法而不是一个独立的功能。事实上,如果你这样做:

f = open(some_file, 'w')   # or 'a' -- some write mode
write_to = f.write

你有几乎相同的功能(只是绑定到特定的file_handle)!

作为练习,您还可以在Python中创建自己的上下文管理器(与with语句一起使用)。您可以通过定义__enter____exit__来执行此操作。所以在技术上你也可以重新定义它:

class FileContextManager():
    def __init__(self, filename):
        self.filename = filename
        self._file = None

    def __enter__(self):
        self._file = open(self.filename, 'w')

    def __exit__(self, type, value, traceback):
        self._file.close()

然后像:

一样使用它
with FileContextManager('hello.txt') as filename:
    filename.write('Hi!')

它会做同样的事情。

所有这一切的要点仅仅是说如果你需要重新实现并添加到默认行为,Python足够灵活,可以完成所有这些,但在标准情况下,没有真正的好处这样做。


就你的例子中的程序而言,在这个简单的案例中几乎没有任何这些方法都没有错。但是,您错过了在main函数中使用with语句的机会:

def main():
    with open('file.txt') as filename:
        while some_condition:
            filename.write('some text')
    # file closed here after we fall off the loop then the with context

if __name__ == '__main__':
    main()

如果你想创建一个以文件句柄作为参数的函数:

def write_stuff(file_handle, text):
    return file_handle.write(text)

def main():
    with open('file.txt', 'w') as filename:
        while some_condition:
            write_stuff(filename, 'some text')
    # file closed here after we fall off the loop then the with context

if __name__ == '__main__':
    main()

同样,你可以采用多种不同的方式,那么你最想做的事情是什么?什么是最可读的?

"我应该在函数中打开一个文件并将指针传递给其他人进行写入,还是应该将其声明为模块变量?"

好吧,正如你所见,要么会奏效。这个问题高度依赖于上下文,通常最佳实践要求文件在最短的时间内以最小的合理范围打开。那么,什么需要访问您的文件?如果模块中有很多东西,可能是一个模块级变量或类来保存它是一个好主意。同样,在琐碎的情况下,只需使用上面的with

答案 1 :(得分:-3)

问题是你在print和()之间放了一个空格。 这段代码在Python3中运行良好:

print(open('yourfile.ext').read())