用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.path
或open()
。
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的知识)。