web-dev-qa-db-ja.com

pathlibを使用してpythonに新しいフォルダーを作成し、そこにファイルを書き込みます

私はこのようなことをしています:

import pathlib

p = pathlib.Path("temp/").mkdir(parents=True, exist_ok=True)

with p.open("temp."+fn, "w", encoding ="utf-8") as f:
    f.write(result)

エラーメッセージ:AttributeError: 'NoneType'オブジェクトには属性 'open'がありません

明らかに、エラーメッセージに基づいて、mkdirNoneを返します。

Jean-Francois Fabreはこの修正を提案しました。

p = pathlib.Path("temp/")
p.mkdir(parents=True, exist_ok=True)

with p.open("temp."+fn, "w", encoding ="utf-8") as f:
    ...

これにより、新しいエラーメッセージがトリガーされました。

ファイル "/Users/user/anaconda/lib/python3.6/pathlib.py"、行1164、open opener = self._opener)
TypeError:整数が必要です(str型を取得しました)

12
Bondrak

pathlib モジュールは、組み込みの open 関数とはわずかに異なるシグネチャを持つopenメソッドを提供します。

pathlib:

_Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
_

ビルトイン:

_open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
_

このp = pathlib.Path("temp/")の場合、パスpが作成されているため、位置引数(キーワードを使用しない)でp.open("temp."+fn, "w", encoding ="utf-8")を呼び出すと、最初がmodeであると想定されます。その後、buffering、およびbufferingは整数を予期しますが、これがエラーの本質です。整数が必要ですが、文字列_'w'_を受け取りました。

この呼び出しp.open("temp."+fn, "w", encoding ="utf-8")は、パスp(ディレクトリ)を開こうとし、サポートされていないファイル名も提供しています。フルパスを作成してから、パスのopenメソッドを呼び出すか、フルパスをopen組み込み関数に渡す必要があります。

2
Davos

あなたが試すことができます:

p = pathlib.Path("temp/")
p.mkdir(parents=True, exist_ok=True)
fn = "test.txt" # I don't know what is your fn
filepath = p / fn
with filepath.open("w", encoding ="utf-8") as f:
    f.write(result)

パスとして文字列を指定しないでください。メソッドfilepathを持つのはオブジェクトopenです。

ソース

26
Till