2014-09-30 60 views
1

我對python不太熟悉,誰能告訴我如何使用python中的變量打開文件? 我想在一個腳本自動化此跨多個目錄運行同一任務使用變量python腳本來打開文件

這裏機器和inputfile中的變量.. 我試着下面的代碼,但不斷收到錯誤

file = open(machine + '/' + inputfile) 

打印工作正常。 。 即對變量進行正確填充:

print 'Input file is "', inputfile -> abc 
print 'Machine "', machine -> xyz 

因此文件位置應該是./xyz/abc

錯誤: 我得到的錯誤是./machine/inputfile文件不存在,即不是取其可變機器和輸入文件的值,而是將其作爲原樣。

道歉,如果這是過於瑣碎問題

+1

雖然您應該查看一下使用'os.path.join'(可能'with with'作爲上下文管理器文件), – sapi 2014-09-30 09:23:44

+1

你的文件已經打開,請閱讀[this](https://docs.python.org/2/tutorial/inputoutput.html)並使用文件 – 2014-09-30 09:25:08

+0

你收到了什麼錯誤? 'inputfile'不是字符串,而是整數或其他類型,在這種情況下,在將它們與'+'連接在一起之前,您應該使用'str(machine)'或'str(inputfile)'將其轉換爲字符串 – jdehesa 2014-09-30 09:27:04

回答

1

在一般意義上,沒有什麼你的代碼錯誤。您的路徑和/或文件名可能有問題。

這是我會怎麼做(在Windows上)

import os 

dir='C:/Users/xxx' # You can use forward slashes on Windows 
file='somefile.txt' 

full_path=os.path.join(dir,file) # OS independent way of building paths 

with open(full_path,'r') as f: # 'with' will automatically close file for you, 
    for line in f: # Do something with the file 
     print line 
+0

感謝這工作完美! – tsar2512 2014-09-30 14:38:25

1

首先,我不建議你命名變量file因爲file()是一個內置的別名在Python中open()功能。你可以這樣做。但我建議不要這麼做,因爲許多Python程序員在看到它時會感到畏懼。

也許「in_filename」爲輸入文件名,「inputfile」爲file()對象。

更重要的是,一旦你打開了文件,你必須調用它的方法(顯式或隱式)才能使用文件的內容。

有幾種方法可以做到這一點。 (正如其他人所指出的,你應該使用os.path.join()的路徑便攜相結合,基本文件名):

#!python 
import os 
path = '/some/path' 
in_filename = 'somefile.txt' 
inputfile = open(os.path.join(path, in_filename), 'r') 
data = inputfile.read() # fetch all contents in one string 
inputfile.seek(0) # reset file object point to beginning of file 
data_lines = inputfile.readlines() # fetch all contents as list of lines 
inputfile.seek(0) # rest file object again 
while True: 
    line = inputfile.readline() # one line at a time (line is a string) 
    if not line: 
     break # length of line is zero at end of file 
     # Note: empty strings are "False" in Python; so this detects EOF 
inputfile.close() # close inputfile 

# alternatively using "context management" features 
with open(os.path.join(path, in_filename), 'r') as infile: 
    for line in infile: 
     do_something(line) 

# infile is implicitly closed on exit from the context management "suite" 
# (indented block of code) 

在此示例中,我展示瞭如何在整個文件作爲一個字符串發出聲音;如何將它作爲行列表,如何逐行迭代以及如何使用「上下文管理器」(with語句)逐行迭代它。

請注意,迭代過一個文件是含蓄調用.readline()(單數)方法。 (這實際上與我們用來打開它的with上下文管理是正交的,with只保證在我們的縮進代碼塊結束之後文件會自動關閉......即使某些異常是由開放或任何其他操作引發的我們對它進行了預處理。for ... in ...:創建並使用迭代器;並且Python中的許多對象定義了迭代語義。對於基於.readline()的調用的文件)

我也在向您展示如何.seek()回到文件的開頭(這可能不會經常執行,但在這種情況下,它是一種顯示所有這些替代閱讀方式的方法該文件不必重複.close()並重新打開它)。

請注意,我明確地使用我的open()調用中的訪問選項來聲明我的文件處理程序將是隻讀的。如果我想讀取和寫入文件,我會使用'w+'等)。

我沒有顯示.read()方法的選項,該方法允許您指定您希望爲每個呼叫讀取的數據量。對於普通的文本文件,這通常不是很有用,因爲那樣你就不得不自己處理任何部分代碼,而這些代碼很雜亂。如果您嘗試使用我的示例來閱讀一些非常大的文件,那麼您可能會導致系統進行頁面切換,並在您的系統中出現嚴重的性能和響應問題。 (在典型的現代化筆記本電腦上,只要文件大小不超過1 GB或2個,就可以正常工作)。

如果您有一個包含固定長度記錄(文本或二進制文件)的文件,使用.read(xxx)(具有特定數量的字符可供任何調用讀取)可能很有用。然而,現在很少有人使用Python或其他腳本語言來操縱固定長度的文件結構。如果您正在處理非文本文件(例如操作MP3文件或圖像等的頭文件,那麼您可能會使用這種方法(並且您可能還想使用struct模塊來「打包」來自其文件的數據文本表示到您的二進制文件格式所需的特定機器本機表示中)

+0

感謝您的詳細解答。文件閱讀部分似乎工作正常。特別是我想我正在尋找os.path.join(),因爲將變量直接放在open()調用中似乎是使用它們,而不是使用它們的值。我將檢查os.path.join並在錯誤修復後立即回覆:) – tsar2512 2014-09-30 14:23:59

相關問題