2014-01-09 74 views
1

我有一個標準格式的csv輸入文件,其中包含一個凌亂的標題,然後是35列和8760行的數組。所有這些數據都是數字,除了第6列,這是文本。我曾嘗試允許genfromtxt()自己弄清楚這一點,但最終該專欄轉向nan s,我相信因爲沒有引號。在csv文件中讀取一列中間的字符串

目前,我正在讀這個數組如下:

WeaData = np.genfromtxt(FileIn, delimiter=",", skip_header=8) 

我試圖與

WeaData = np.genfromtxt(FileIn, delimiter=",", skip_header=8, dtype=(float,float,float,float,float,str,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float)) 

WeaData = np.genfromtxt(FileIn, delimiter=",", skip_header=8, dtype=[float for n in range(5)]+['S10']+[float for n in range(29)]) 

,但沒有運氣手動指定列類型。我相信我的語法在第一個選項中是錯誤的,第二個返回空白數組。有沒有簡單的方法來做到這一點,最好不指定35列類型?

這裏有三行我的csv文件供參考,在我不關心的標題後面。

1966,1,1,1,60,A7A7A7A7*0?0?0?0?0?0?0?0A7A7A7A7A7A7F8F8A7E7,3.9,1.7,86,102400,0,0,264,0,0,0,0,0,0,0,230,2.1,0,0,24.1,77777,0,999999999,8,0.1000,0,88,0.000,0.0,0.0 
1966,1,1,2,60,A7A7A7A7*0?0?0?0?0?0?0?0A7A7A7A7A7A7F8F8A7E7,4.4,0.0,73,102500,0,0,265,0,0,0,0,0,0,0,270,3.6,0,0,24.1,77777,0,999999999,8,0.1000,0,88,0.000,0.0,0.0 
1966,1,1,3,60,A7A7A7A7*0?0?0?0?0?0?0?0A7A7A7A7A7A7F8F8A7E7,2.8,-0.6,79,102500,0,0,258,0,0,0,0,0,0,0,310,2.1,0,0,24.1,77777,0,999999999,8,0.1000,0,88,0.000,0.0,0.0 

我正在使用Python V2.7。

+0

嗨,有很多方法來讀取一個CSV應該看看這個[問題](http://stackoverflow.com/questions/20982437/how-to-parse-a-csv-with-python-當一列有多行) – ELavicount

+0

是否有你需要直接讀取到一個numpy數組的原因?你可能應該看看'pandas' –

+0

使用一個只顯示三行的數據文件,你的第二個例子適用於我。我將「S10」更改爲「S32」以確保文本字段未被截斷,並且我沒有使用「skip_header」參數,因爲我沒有添加標題。當你像這樣指定一個dtype時,該函數返回一個結構化數組(http://docs.scipy.org/doc/numpy/user/basics.rec.html)。那是你得到的嗎? –

回答

1

使用numpy.loadtxt與參數usecols僅用於選擇包含浮點數的列。

>>> import numpy as np 
>>> cols = range(0,5) + range(6,35) 
>>> data = np.loadtxt("data.txt", delimiter=",", usecols=cols, dtype=np.float) 
>>> data 
[[ 1.96600000e+03 1.00000000e+00 1.00000000e+00 1.00000000e+00 
    6.00000000e+01 3.90000000e+00 1.70000000e+00 8.60000000e+01 
    1.02400000e+05 0.00000000e+00 0.00000000e+00 2.64000000e+02 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 2.30000000e+02 
    2.10000000e+00 0.00000000e+00 0.00000000e+00 2.41000000e+01 
    7.77770000e+04 0.00000000e+00 9.99999999e+08 8.00000000e+00 
    1.00000000e-01 0.00000000e+00 8.80000000e+01 0.00000000e+00 
    0.00000000e+00 0.00000000e+00] 
[ 1.96600000e+03 1.00000000e+00 1.00000000e+00 2.00000000e+00 
    6.00000000e+01 4.40000000e+00 0.00000000e+00 7.30000000e+01 
    1.02500000e+05 0.00000000e+00 0.00000000e+00 2.65000000e+02 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 2.70000000e+02 
    3.60000000e+00 0.00000000e+00 0.00000000e+00 2.41000000e+01 
    7.77770000e+04 0.00000000e+00 9.99999999e+08 8.00000000e+00 
    1.00000000e-01 0.00000000e+00 8.80000000e+01 0.00000000e+00 
    0.00000000e+00 0.00000000e+00] 
[ 1.96600000e+03 1.00000000e+00 1.00000000e+00 3.00000000e+00 
    6.00000000e+01 2.80000000e+00 -6.00000000e-01 7.90000000e+01 
    1.02500000e+05 0.00000000e+00 0.00000000e+00 2.58000000e+02 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 
    0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10000000e+02 
    2.10000000e+00 0.00000000e+00 0.00000000e+00 2.41000000e+01 
    7.77770000e+04 0.00000000e+00 9.99999999e+08 8.00000000e+00 
    1.00000000e-01 0.00000000e+00 8.80000000e+01 0.00000000e+00 
    0.00000000e+00 0.00000000e+00]] 

如果你想包括第6列,那麼你將不得不加載矩陣作爲對象,你不能混合浮動與字符串。

>>> data = np.loadtxt("data.txt", delimiter=",", dtype=np.object) 

因此,如果您需要此列,請單獨加載。

+0

謝謝,這是有效的。一些新的但仍然存在的問題 - 然後我需要能夠將所有的東西都寫回到一個文本文件(與我閱讀它的格式相同),但是我有一些列作爲數字類型,一列作爲字符串。 np.savetxt抱怨,因爲不是所有的元素都是浮動的。將一組浮點數和字符串保存到文本文件的最佳做法是什麼?有沒有一種乾淨的直接方式,或者可能需要首先將整個事物轉換爲字符串? –

相關問題