2016-10-11 171 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

我從來沒有使用的臨時文件,是否有你arn't使用標準'的open()''write'和'read'方法的原因嗎? – kpie

+0

我想防止文件名已存在的可能性,我可以覆蓋它 –

+0

1.您是否考慮過簡單地將輸出從一個腳本輸送到第二個腳本的輸入? 2.您是否正在檢查以確保臨時文件存在於您正在查找的路徑中? – erapert

回答

6

根據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) 
+0

謝謝你解決了它。 .seek(0)完成了什麼? –

+0

是你正在談論的倒帶? –

+2

在'tmp.writelines'之後,文件指針位於文件末尾。 'tmp.seek(0)'把它重新放回到頭部(倒帶它 - 也許這是古老的盒式磁帶隱語!),所以你可以閱讀你寫的東西。 – tdelaney

5

你有一個範圍問題;文件tmp只存在於創建它的with語句的範圍內。此外,如果您想在初始with之外訪問該文件(這使操作系統能夠訪問該文件),則需要使用NamedTemporaryFile。另外,我不確定你爲什麼試圖附加到一個臨時文件...因爲它在實例化之前不會存在。

試試這個:

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