2016-10-11 30 views
4

私は、別のファイルからいくつかの行に書き込んだテンポラリファイルを作成しようとしています。私はそれを読むことができるように一時ファイルを見つけて開く方法がわかりません。私のコード: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() 

私はちょうどファイルを誤って上書きするのを防ぐために仲介業者の一時的な文書を作りたいと思っています。

+0

私は一時ファイルを使用したことがありません、あなたは標準の 'オープン()' 'write'と' read'メソッドを使用してarn't何らかの理由があるのでしょうか? – kpie

+0

ファイル名がすでに存在していて、それを上書きする可能性があります。 –

+0

1. 2つ目のスクリプトの入力に1つのスクリプトの出力を単純に配管することを検討しましたか? 2.あなたが探しているパスに一時ファイルが存在することを確認していますか? – erapert

答えて

6

によれば、ファイルは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) 
+0

ありがとうございました。 .seek(0)は何を達成するのですか? –

+0

はあなたが巻き返していることですか? –

+2

'tmp.writelines'の後、ファイルポインタはファイルの最後にあります。 'tmp.seek(0)'はそれを先頭に戻します(巻き戻します - 古代カセットテープ用語です!)ので、あなたが書いたものを読むことができます。 – tdelaney

5

スコープに問題があります。ファイルtmpは、それを作成する文のwithの範囲内にのみ存在します。さらに、最初にwithの外側にあるファイルにアクセスする場合は、NamedTemporaryFileを使用する必要があります(これにより、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 
+0

ファイルを閉じてから再度開いてから読み込む場合は、ファイルに書き込んだ後に "f.seek(0)"を追加してください。さもなければ、間違った結果をもたらすファイルの終わりを読むでしょう。 – jelde015

関連する問題