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

ibz*_*ibz 67 python

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

with open(filename) as f:
    s = f.read()
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以使它更短(最好是一行),更具可读性?

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

Mar*_*nen 125

with open('x.py') as f: s = f.read()
Run Code Online (Sandbox Code Playgroud)

******笑着

  • 这个答案有什么问题?不建议? (5认同)
  • awwwwwwwwww; ^) (2认同)

pyf*_*unc 38

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

s = open(filename, 'r').read()
Run Code Online (Sandbox Code Playgroud)

  • 不是真的,你的文件打开了. (16认同)
  • 如果您的设计目标是"一行代码",那么您已经吸入了太多的Perl,并且您需要安排一些严重的非洗脑时间. (10认同)
  • 不,这丝毫不会混淆. (5认同)
  • 当引用计数为零时,CPython实现会关闭文件,但这是不应依赖的实现细节。 (3认同)
  • @Glenn Maynard:理论上,关闭可以延迟到进程终止为止,同时,打开的文件可能会泄漏(例如,在“fork()”的情况下泄漏到子进程)。 (2认同)

Eya*_*vin 20

使用pathlib.

Python 3.5及以上版本:

from pathlib import Path
contents = Path(file_path).read_text()
Run Code Online (Sandbox Code Playgroud)

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

$ pip install pathlib2
Run Code Online (Sandbox Code Playgroud)

然后

from pathlib2 import Path
contents = Path(file_path).read_text()
Run Code Online (Sandbox Code Playgroud)

写作也很简单:

Path(file_path).write_text('my text')
Run Code Online (Sandbox Code Playgroud)


ars*_*ars 18

contents = open(filename).read()
Run Code Online (Sandbox Code Playgroud)

  • 你什么时候关闭文件? (6认同)

sna*_*hoe 10

如果您愿意使用库,请尝试安装forked-path(使用easy_install或pip).

然后你可以这样做:

from path import path
s = path(filename).bytes()
Run Code Online (Sandbox Code Playgroud)

这个库是相当新的,但它是一个库的一个分支,已经在Python中浮动了很多年并且已经使用了很多.自从我多年前找到这个库以来,我很少使用os.path或者open()更多.


Gle*_*ard 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()
Run Code Online (Sandbox Code Playgroud)


eum*_*iro 5

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

import subprocess

contents = subprocess.Popen('cat %s' % filename, shell = True, stdout = subprocess.PIPE).communicate()[0]
Run Code Online (Sandbox Code Playgroud)

  • 肯定符合问题的精神......反常使用Python使其类似于Bash并不比使它像Ruby或Perl更糟糕. (5认同)
  • aaaaaaaaaaargh!(超过'a'以满足min char限制) (3认同)

PYK*_*PYK 5

就这么简单:

    f=open('myfile.txt')
    s=f.read()
    f.close()
Run Code Online (Sandbox Code Playgroud)

对内容“s”做任何你想做的事