2015-06-19 49 views
-1

我有一些數據的文件FILE.CSV:Python的CSV與第一線字典作爲標題

fn,ln,tel 
john,doe,023322 
jul,dap,024322 
jab,sac,0485 

我想有一個我可以訪問這樣的數組:

file = 'file.csv' 
with open(file,'rU') as f: 
    reader = csv.DictReader(f) 

print reader[0].fn 

所以我想它打印第一個記錄的名字。不幸的是,我得到這個錯誤:

ValueError: I/O operation on closed file 

我怎樣才能得到它這樣做,我並不需要保持打開的文件,我也可以用我的數組玩。順便說一句,我不需要寫回csv文件,我只需要使用數據,爲此,我可以修改的數組將是最好的。

+0

什麼輸出你想要一個字典或數組?您的錯誤對您提供的代碼也不正確 –

+0

請注意'reader [0]'不適用於'with'語句。你會得到一個'AttributeError',因爲'reader'對象沒有'__getitem__'方法。另外,'DictReader'行是普通的字典,所以'row.fn'不起作用,你可以使用'row ['fn']'。你在這裏過分簡化了一些東西。 –

回答

4

您需要將with塊內的訪問閱讀器*,它不是外面:

file = 'file.csv' 
with open(file,'rU') as f: 
    reader = csv.DictReader(f) 
    first_row = next(reader) 
    print first_row['fn'] 

只要你外塊移動代碼,該f文件對象關閉,你不能獲得閱讀器中的行不再。這是with聲明的一點。

如果你想有該文件中的所有行的隨機存取,讀寫器轉換到一個列表第一:

file = 'file.csv' 
with open(file,'rU') as f: 
    reader = csv.DictReader(f) 
    all_rows = list(reader) 

print all_rows[0]['fn'] 

list()通話將遍歷reader,將每個結果產生的列表對象直到讀取所有行。確保你有足夠的內存來保存所有這些行。

+0

我明白了,但我該怎麼辦才能保持外面呢?我需要在不同的功能中使用它。 – Richard

+0

@Richard:已更新。 :-) –

+0

讀者[0] .fn'如何導致IO錯誤? –