Pythonでファイルのコンテンツを読み書きする最も簡単な方法


82

Rubyでは、を使用してファイルから読み取ることができますs = File.read(filename)。Pythonで私が知っている最短で最も明確なものは

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

それをさらに短く(できれば1行)そして読みやすくする他の方法はありますか?

注:最初は、この質問を「1行のコードで実行する」と表現しました。S.Lottが指摘しているように、短いほど読みやすいとは限りません。だから私は自分の質問を言い換えて、私が何を意味するのかを明確にしました。Rubyコードは、必ずしも1行対2行であるため(それも重要ですが)、ファイルを閉じる人が誰であるかについて疑問の余地がないインスタンスメソッドとは対照的に、クラスメソッドであるため、より優れて読みやすくなると思います。例外が発生した場合でも確実に閉じる方法など。以下の回答で指摘されているように、GCを使用してファイルを閉じることができます(したがって、これはワンライナーになります)が、それでもコードが悪化します短いですが。持ち運びできないだけでなく、不明確にすることによって。


7
独自の関数を作成します。その後、それを使用してコンテンツを取得できます。通話は1行になります。
Felix Kling 2010

1
不思議なことに、Rubyステートメントはファイルも閉じますか?
dheerosaur 2010

8
-1:コードゴルフでは誰も勝ちません。
S.Lott 2010

3
私の質問は私にとって理にかなっています。私はこれらの2行(with2.5のステートメントの4行前)を書くためのより良い方法を見つけようとしています。方法があるかもしれませんし、ないかもしれません。私はいつでも見つけようとすることができますよね?気に入らない場合は、反対票を投じて先に進んでください。:)
ibz 2010

1
の利点はFile.readlines("filename")、名前が付けられたファイルの内容を読み取ることです。証拠のどこにもファイルハンドル、記述子、またはオブジェクトはありません。私が見たすべてのPythonの「同等物」には、明示的なオープン/クローズ(さらに悪いことに、明示的なクローズを必要とする暗黙的なオープン)が含まれています。
マークリード

回答:


11

ライブラリを使用することに慣れている場合は、forked-pathをインストールしてみてください(easy_installまたはpipのいずれかを使用)。

次に、次のことができます。

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

このライブラリはかなり新しいものですが、Pythonの周りに何年も浮かんでいて、かなり使用されているライブラリのフォークです。私はこのライブラリ年前に見つかったので、私はめったに使用しないos.pathopen()、それ以上。


素敵なライブラリのように見えます。これだけのためにインストールするのではありませんが、念頭に置いておきます。
ibz 2010

1
完全なハックなので、なぜこれが受け入れられた答えだったのかわかりません!
nikolay 2017

Windowsのpip18.6によってインストールされたフォークパスv0.2.3は、Python3.6.4と互換性がありません。8進定数に使用される形式(たとえば、の0777代わりに0o0777)は、現在のPythonバージョンではサポートされていないようです。
Christoffer Soop 2018年

EyalLevinの答えに+1 。8年前に最初にこれに答えたときにpathlibまたはpathlib2が存在していたとしたら、fork-pathではなくそれらについて言及したでしょう。私は何年もフォークパスを使用していません。
スナップシュー2018年


43

これは上記と同じですが、エラーを処理しません。

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

21
実際には、ファイルを開いたままにしておきます。
ibz 2010

3
CPython実装は、参照カウントがゼロになるとファイルを閉じますが、これは実装の詳細であり、信頼すべきではありません。
Mark Tolonen 2010

1
これはエラーを処理します。通常どおり例外がスローされます。これがないではない「開いているファイルを残す」が、ファイルのクローズをさせることが何それを行うことはある遅れGCの実装に依存します。これは問題になる可能性があります(Windowsでのロック、たとえば、多数のファイルをループする場合のFD制限)が、ファイルを開いたままにする(たとえば、ファイルのリーク)とは大きく異なります。
グレンメイナード

11
設計目標が「1行のコード」である場合は、Perlを吸い込みすぎているため、洗脳を行わない深刻な時間をスケジュールする必要があります。
グレンメイナード

6
いいえ、これは少しでも混乱しません。
グレンメイナード

36

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')

18
contents = open(filename).read()

9
そして、いつファイルを閉じますか?
ibz 2010

1
@ionut bizau-返送open(...)がガベージコレクションの場合、と思います。私が間違っていたら誰かが私を訂正します。
間違いなく2010

1
これが最短の方法です。なぜ投票がないのかわかりません。
Pritesh Acharya

10

これはPerlではありません。複数行に相当するコードを1行に強制的に適合させたくはありません。関数を記述してから、関数を呼び出すには1行のコードが必要です。

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()

5

遅く、醜い、プラットフォーム固有...しかしワンライナー;-)

import subprocess

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

3
aaaaaaaaaaargh!(最小文字数制限を満たすための過剰な 'a's)
Peter Gibson

5
確かに質問の精神と一致します... Pythonを不正に使用してBashに似せることは、RubyやPerlに似せることよりも悪いことではありません。
間違いなく2010

3

そのような単純な:

    f=open('myfile.txt')
    s=f.read()
    f.close()

そして、コンテンツ「s」で好きなことをしてください


-1
contents = open(filename)

これによりジェネレーターが提供されるため、値をどこかに保存する必要があります。

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

これにより、明示的なクローズをリストするための保存は不可能になります(少なくともPythonの知識がある場合)。


1
そしてcontents = '' .join(open(filename)の行の行)を使用すると、元のファイルの内容が得られます...
eumiro 2010

ファイルをイテレータとして使用しても、(のように)決定論的にファイルが閉じられることはありませwith。反復が終了した後でも、ファイルをシークして再度読み取りを開始することは有効であるため、それはできません。反復によってファイルが閉じられた場合は機能しません。
グレンメイナード

@Glennしかし、私の例のようにリスト内包表記でジェネレーターを使用すると、名前がないため、ジェネレーターを閉じることさえできません。
Tony Veijalainen 2010

「閉じることができない」と「閉じる必要がない」は同じではありません。
グレンメイナード

たぶんそうかもしれませんが、リスト内包表記からそのファイルハンドルにアクセスする方法がわかりません。Pythonで 'すべてのファイルI / Oを終了し、すべてのプログラムで開いたファイルを閉じる'コマンドを実行する必要がありますか?または、ファイルオブジェクトの明示的なgcで十分でしょうか?リスト内包表記は別のスコープであるため、ファイルハンドルはスコープ外です。
Tony Veijalainen 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.