在Ruby中,您可以使用s = File.read(filename)
从文件中读取。我在Python中知道的最短和最清楚的是
with file(filename) as f:
s = f.read()
还有其他方法可以使它更短(最好是一行)并且更具可读性吗?
注意:最初我把这个问题称为“在一行代码中执行此操作”。正如S.Lott所指出的,更短的并不意味着更具可读性。所以我只是为了弄清楚我的意思而改写了我的问题。我认为Ruby代码更好,更可读,不一定是因为它是一行而不是两行(虽然这也很重要),但也因为它是一个类方法而不是实例方法,这对于谁关闭文件毫无疑问,即使引发异常,如何确保它被关闭等。如下面的答案中所指出的,你可以依靠GC来关闭你的文件(从而使它成为一个单行),但这会使代码变得更糟虽然它更短。不仅是不可移植,而是使其不清楚。
答案 0 :(得分:117)
with open('x.py') as f: s = f.read()
*** ***笑着
答案 1 :(得分:38)
这与上述相同,但不处理错误:
s = open(filename, 'r').read()
答案 2 :(得分:16)
contents = open(filename).read()
答案 3 :(得分:15)
使用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')
答案 4 :(得分:10)
如果您愿意使用库,请尝试安装forked-path(使用easy_install或pip)。
然后你可以这样做:
from path import path
s = path(filename).bytes()
这个库是相当新的,但它是一个库的一个分支,已经在Python中浮动多年并且已经被使用了很多。自从我多年前找到这个库以来,我很少再使用os.path
或open()
。
答案 5 :(得分:9)
这不是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()
答案 6 :(得分:5)
缓慢,丑陋,特定于平台...但是单行; - )
import subprocess
contents = subprocess.Popen('cat %s' % filename, shell = True, stdout = subprocess.PIPE).communicate()[0]
答案 7 :(得分:-1)
contents = open(filename)
这为您提供了生成器,因此您必须在某处保存值,或
contents = [line for line in open(filename)]
这样就不可能保存列出显式关闭(至少在我对Python的了解下)。
答案 8 :(得分:-1)
我称之为<整洁的方式:
f=open('myfile.txt')
s=f.read()
f.close()
然后对内容“ s”
进行任何操作对于大文件,我建议一行接一行: f.readlines() ....例如在WITH语句中