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

时间:2010-09-21 07:29:50

标签: python

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

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

还有其他方法可以使它更短(最好是一行)并且更具可读性吗?

注意:最初我把这个问题称为“在一行代码中执行此操作”。正如S.Lott所指出的,更短的并不意味着更具可读性。所以我只是为了弄清楚我的意思而改写了我的问题。我认为Ruby代码更好,更可读,不一定是因为它是一行而不是两行(虽然这也很重要),但也因为它是一个类方法而不是实例方法,这对于谁关闭文件毫无疑问,即使引发异常,如何确保它被关闭等。如下面的答案中所指出的,你可以依靠GC来关闭你的文件(从而使它成为一个单行),但这会使代码变得更糟虽然它更短。不仅是不可移植,而是使其不清楚。

9 个答案:

答案 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.pathopen()

答案 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语句中