用Python读取/写入文件内容的最简单的方法

在Ruby中,您可以使用s = File.read(filename)从文件中读取。 我在Python中知道的最短和最清晰的是

 with file(filename) as f: s = f.read() 

有没有其他的方式来做到这一点,使其更短(最好是一行),更具可读性?

注意:最初我把这个问题说成是“在一行代码中完成”。 正如S.Lott所指出的,“短”不一定意味着更多的可读性。 所以我只是为了明确我的意思而转述了我的问题。 我认为Ruby代码更好,更可读,不一定是因为它是一行还是两行(尽pipe这很重要),但也是因为它是一个类方法,而不是一个实例方法,这不涉及谁closures文件,如何确保即使发生exception也能closures它等等。正如下面的答案所指出的那样,您可以依靠GC来closures文件(因此使其成为一行代码),但是这会使代码变得更糟尽pipe它更短。 不仅是不可移植的,而且是不明确的。

如果您打算使用库,请尝试安装分叉path (使用easy_install或pip)。

那你可以这样做:

 from path import path s = path(filename).bytes() 

这个库是相当新的,但它是一个库的叉子,已经在Python上浮动了很多年,并且已经被使用了很多。 自从我几年前发现这个库以来,我很less使用os.pathopen()

 with open('x.py') as f: s = f.read() 

*** ***笑着

这与上面相同,但不处理错误:

 s = open(filename, 'r').read() 
 contents = open(filename).read() 

这不是Perl; 你不想强制将多行代码放在一行上。 写一个函数,然后调用函数占用一行代码。

 def read_file(fn): """ >>> import os >>> fn = "/tmp/testfile.%i" % os.getpid() >>> open(fn, "w+").write("testing") >>> read_file(fn) 'testing' >>> os.unlink(fn) >>> read_file("/nonexistant") Traceback (most recent call last): ... IOError: [Errno 2] No such file or directory: '/nonexistant' """ with open(fn) as f: return f.read() if __name__ == "__main__": import doctest doctest.testmod() 

缓慢,丑陋,特定于平台……但是单线程;-)

 import subprocess contents = subprocess.Popen('cat %s' % filename, shell = True, stdout = subprocess.PIPE).communicate()[0] 

使用pathlib 。

Python 3.5及以上版本:

 from pathlib import Path contents = Path(file_path).read_text() 

对于较低版本的Python,请使用pathlib2 :

 $ pip install pathlib2 

然后

 from pathlib2 import Path contents = Path(file_path).read_text() 

写作同样简单:

 Path(file_path).write_text('my text') 
 contents = open(filename) 

这给你生成器,所以你必须保存某个值的地方,或者

 contents = [line for line in open(filename)] 

这是保存列出明确的closures是不可能的(至less在我的Python的知识)。