我知道提交阅读/写作的最佳方式是使用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()
答案 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())