2010-08-19 49 views
252

我想知道是否有一種直接的方法可以將csv文件的內容導入到記錄陣列中,這與R的read.table(),read.delim()read.csv()系列將數據導入到R的數據框的方式相當?如何將csv讀入numpy中的記錄數組?

或者是使用csv.reader()然後應用numpy.core.records.fromrecords()之類的最佳方式?

+0

的可能的複製[如何閱讀和使用Python寫的CSV文件?(http://stackoverflow.com/questions/41585078/how -do -i-read-and-write-csv-files-with-python) – 2017-01-16 15:28:56

回答

397

您可以使用Numpy的genfromtxt()方法來完成此操作,方法是將delimiter kwarg設置爲逗號。

from numpy import genfromtxt 
my_data = genfromtxt('my_file.csv', delimiter=',') 

有關該功能的更多信息,請參閱其各自的documentation

+4

如果你想要一些不同類型的東西,該怎麼辦?像字符串和整數? – CGTheLegend 2017-03-21 02:20:49

+4

@CGTheLegend np.genfromtxt('myfile.csv',delimiter =',',dtype = None) – chickensoup 2017-04-26 02:45:48

+0

[numpy.loadtxt](https://docs.scipy.org/doc/numpy/reference/generated/numpy。 loadtxt.html)對我來說工作得很好 – 2017-05-19 17:34:22

63

您也可以嘗試recfromcsv(),它可以猜測數據類型並返回格式正確的記錄數組。

+7

如果要維護CSV中的排序/列名稱,可以使用以下調用:'numpy.recfromcsv(fname,delimiter =',',filling_values = numpy.nan,case_sensitive = True,deletechars ='',replace_space ='')' 關鍵參數是最後三個。 – eacousineau 2013-10-17 14:00:43

101

我會從pandas庫推薦read_csv功能:

import pandas as pd 
df=pd.read_csv('myfile.csv', sep=',',header=None) 
df.values 
array([[ 1. , 2. , 3. ], 
     [ 4. , 5.5, 6. ]]) 

這給出了一個熊貓DataFrame - 允許many useful data manipulation functions which are not directly available with numpy record arrays

DataFrame is a 2-dimensional labeled data structure with columns of potentially different types. You can think of it like a spreadsheet or SQL table...


我也建議genfromtxt。然而,由於這個問題要求一個record array,而不是正常的陣列,所述dtype=None參數需要被添加到genfromtxt呼叫:

給定一個輸入文件,myfile.csv

1.0, 2, 3 
4, 5.5, 6 

import numpy as np 
np.genfromtxt('myfile.csv',delimiter=',') 

給出了一個陣列:

array([[ 1. , 2. , 3. ], 
     [ 4. , 5.5, 6. ]]) 

np.genfromtxt('myfile.csv',delimiter=',',dtype=None) 

給出了一個記錄陣列:

array([(1.0, 2.0, 3), (4.0, 5.5, 6)], 
     dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')]) 

這具有與multiple data types (including strings) can be easily imported文件的優勢。

+0

read_csv在引號內使用逗號。通過genfromtxt推薦此文件 – Viet 2016-04-06 21:37:00

+0

如果您的文件具有1行標題,則使用標題= 0跳過值中的第一行 – 2017-06-30 13:34:54

54

我約70列定時的

from numpy import genfromtxt 
genfromtxt(fname = dest_file, dtype = (<whatever options>)) 

import csv 
import numpy as np 
with open(dest_file,'r') as dest_f: 
    data_iter = csv.reader(dest_f, 
          delimiter = delimiter, 
          quotechar = '"') 
    data = [data for data in data_iter] 
data_array = np.asarray(data, dtype = <whatever options>)  

在460萬行,發現numpy的路花了2分分鐘16戰鬥機和CSV列表理解方法了13S。

我會推薦csv-list理解方法,因爲它很可能依賴於預編譯的庫,而不是像numpy那樣多的解釋器。我懷疑熊貓的方法會有類似的解釋開銷。

+13

我測試了與包含260萬行和8列的csv文件類似的代碼。 numpy.recfromcsv()耗時約45秒,np.asarray(list(csv.reader()))耗時約7秒,而pandas.read_csv()耗時約2秒(!)。 (這個文件最近在所有情況下都是從磁盤讀取的,所以它已經存在於操作系統的文件緩存中。)我想我會和大熊貓一起去。 – 2016-03-31 21:56:37

+3

我剛剛注意到有一些關於熊貓的快速csv解析器的設計說明,網址是http://wesmckinney.com/blog/a-new-high-performance-memory-efficient-file-parser-engine-for-pandas/ 。作者非常重視速度和內存要求。也可以使用as_recarray = True直接將結果作爲Python記錄數組而不是熊貓數據框。 – 2016-04-05 19:20:31

4

您可以使用此代碼在發送csv文件數據到一個數組

import numpy as np 
csv = np.genfromtxt('test.csv',delimiter=",") 
print(csv) 
2

我嘗試這樣做:

import pandas as p 
import numpy as n 

closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float) 
print(closingValue) 
2

當我嘗試使用numpy的和熊貓兩種方式,利用大熊貓有很多優點: - 更快 - 更低的CPU使用率 - 1/3 RAM使用比較numpy的genfromtxt

這是我的測試代碼:

$ for f in test_pandas.py test_numpy_csv.py ; do /usr/bin/time python $f; done 
2.94user 0.41system 0:03.05elapsed 109%CPU (0avgtext+0avgdata 502068maxresident)k 
0inputs+24outputs (0major+107147minor)pagefaults 0swaps 

23.29user 0.72system 0:23.72elapsed 101%CPU (0avgtext+0avgdata 1680888maxresident)k 
0inputs+0outputs (0major+416145minor)pagefaults 0swaps 

test_numpy_csv.py

from numpy import genfromtxt 
train = genfromtxt('/home/hvn/me/notebook/train.csv', delimiter=',') 

test_pandas.py

from pandas import read_csv 
df = read_csv('/home/hvn/me/notebook/train.csv') 

數據文件:

du -h ~/me/notebook/train.csv 
59M /home/hvn/me/notebook/train.csv 

隨着numpy的和熊貓的版本:

$ pip freeze | egrep -i 'pandas|numpy' 
numpy==1.13.3 
pandas==0.20.2 
0

使用numpy.loadtxt

一個很簡單的方法。但是,它需要的所有元素是浮動(INT等)

import numpy as np 
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)