幕布斯6054654
2021-03-09 13:13:01
我正在嘗試genfromtxt與Python3一起使用,以讀取包含字符串和數(shù)字的簡單csv文件。例如,類似以下內(nèi)容(以下稱為“ test.csv”):1,a2,b3,c使用Python2,以下代碼可以很好地工作:import numpydata=numpy.genfromtxt("test.csv", delimiter=",", dtype=None)# Now data is something like [(1, 'a') (2, 'b') (3, 'c')]在Python3中,返回相同的代碼[(1, b'a') (2, b'b') (3, b'c')]。由于Python3讀取文件的方式不同,所以這在某種程度上是可以預(yù)期的。因此,我使用轉(zhuǎn)換器來解碼字符串:decodef = lambda x: x.decode("utf-8")data=numpy.genfromtxt("test.csv", delimiter=",", dtype="f8,S8", converters={1: decodef})這適用于Python2,但不適用于Python3(相同的[(1, b'a') (2, b'b') (3, b'c')]輸出。但是,如果在Python3中,我使用上面的代碼僅讀取一列:data=numpy.genfromtxt("test.csv", delimiter=",", usecols=(1,), dtype="S8", converters={1: decodef})輸出字符串['a' 'b' 'c']已按預(yù)期進(jìn)行解碼。我也試著提供文件的輸出open與'rb'模式,在所建議的這個環(huán)節(jié),但目前還沒有改進(jìn)。為什么僅讀取一列而不讀取兩列時轉(zhuǎn)換器起作用?您能否建議我genfromtxt在Python3中使用的正確方法?難道我做錯了什么?先感謝您!
3 回答

嚕嚕噠
TA貢獻(xiàn)1784條經(jīng)驗 獲得超7個贊
我的問題的答案是使用dtype
unicode字符串(U2
例如)。
感謝E.Kehler的回答,我找到了解決方案。如果在定義中使用str
代替,則第二列的輸出為空:S8
dtype
numpy.genfromtxt("test.csv", delimiter=",", dtype='f8,str')
輸出為:
array([(1.0, ''), (2.0, ''), (3.0, '')], dtype=[('f0', '<f16'), ('f1', '<U0')])
這表明我可以正確dtype
地解決我的問題的是一個unicode字符串:
numpy.genfromtxt("test.csv", delimiter=",", dtype='f8,U2')
給出預(yù)期的輸出:
array([(1.0, 'a'), (2.0, 'b'), (3.0, 'c')], dtype=[('f0', '<f16'), ('f1', '<U2')])
有用的信息也可以在numpy數(shù)據(jù)類型doc頁面上找到。

有只小跳蛙
TA貢獻(xiàn)1824條經(jīng)驗 獲得超8個贊
在python 3中編寫
dtype =“ S8”
(或NumPy的genfromtxt中的“ S#”的任何變體)會產(chǎn)生一個字節(jié)字符串。為了避免這種情況,只獲取老式字符串,請編寫
dtype = str

波斯汪
TA貢獻(xiàn)1811條經(jīng)驗 獲得超4個贊
training = np.genfromtxt('twitter_train.csv', delimiter=',', usecols=(0,1), dtype='U')
在我的情況下,第一列包含的情感值為0或1,第二列是一個字符串,由許多字符組成,表示此ex中的一條推文。 dtype ='U '從包含的位置刪除了b'。
因此,在您的情況下,它將是:data = numpy.genfromtxt(“ test.csv”,delimiter =“,”,dtype ='U')
添加回答
舉報
0/150
提交
取消