web-dev-qa-db-ja.com

Python-一時ファイルの書き込みと読み取り

別のファイルからいくつかの行に書き込む一時ファイルを作成してから、データからいくつかのオブジェクトを作成しようとしています。一時ファイルを見つけて開く方法がわからないので、読むことができます。私のコード:

with tempfile.TemporaryFile() as tmp:
    lines = open(file1).readlines()
    tmp.writelines(lines[2:-1])

dependencyList = []

for line in tmp:
    groupId = textwrap.dedent(line.split(':')[0])
    artifactId = line.split(':')[1]
    version = line.split(':')[3]
    scope = str.strip(line.split(':')[4])
    dependencyObject = depenObj(groupId, artifactId, version, scope)
    dependencyList.append(dependencyObject)
tmp.close()

基本的に、偶然ファイルを上書きしないように、仲介者の一時的なドキュメントを作成したいだけです。

17
d.griner

docs に従って、TemporaryFileが閉じられるとファイルが削除されます。これはwith句を終了すると発生します。したがって... with句を終了しないでください。ファイルを巻き戻し、withで作業を行います。

with tempfile.TemporaryFile() as tmp:
    lines = open(file1).readlines()
    tmp.writelines(lines[2:-1])
    tmp.seek(0)

    for line in tmp:
        groupId = textwrap.dedent(line.split(':')[0])
        artifactId = line.split(':')[1]
        version = line.split(':')[3]
        scope = str.strip(line.split(':')[4])
        dependencyObject = depenObj(groupId, artifactId, version, scope)
        dependencyList.append(dependencyObject)
20
tdelaney

スコープの問題があります。ファイルtmpは、それを作成するwithステートメントのスコープ内にのみ存在します。さらに、後で最初のNamedTemporaryFileの外部でファイルにアクセスする場合は、withを使用する必要があります(これにより、OSがファイルにアクセスできるようになります)。また、なぜ一時ファイルに追加しようとしているのかわかりません...インスタンス化する前に存在しなかったからです。

これを試して:

import tempfile

tmp = tempfile.NamedTemporaryFile()

# Open the file for writing.
with open(tmp.name, 'w') as f:
    f.write(stuff) # where `stuff` is, y'know... stuff to write (a string)

...

# Open the file for reading.
with open(tmp.name) as f:
    for line in f:
        ... # more things here
17
Pierce Darragh

ファイルをもう一度開く必要がある場合、たとえばこれを別のプロセスで読み取ります Windows OSで問題が発生する可能性があります

名前を使用してファイルを再度開くことができるかどうか、名前付き一時ファイルがまだ開いている間は、プラットフォームによって異なります(UNIXでは使用できますが、Windows NT以降では使用できません)。

したがって、安全な解決策は、代わりに 一時ディレクトリを作成 にしてから、手動でファイルを作成することです:

import os.path
import tempfile

with tempfile.TemporaryDirectory() as td:
    f_name = os.path.join(td, 'test')
    with open(f_name, 'w') as fh:
        fh.write('<content>')
    # Now the file is written and closed and can be used for reading.
0
a_guest