Python 如何在没有第一列的情况下读取CSV

Python 如何在没有第一列的情况下读取CSV,python,csv,numpy,Python,Csv,Numpy,我正在尝试读取一个简单的CSV文件,如下所示,并将其内容放入2D数组中: "","x","y","sim1","sim2","sim3","sim4","sim5","sim6","sim7","sim8","sim9","sim10","sim11","sim12" "1",181180,333740,5.56588745117188,6.29487752914429,7.4835410118103,5.75873327255249,6.62183284759521,5.81478500366

我正在尝试读取一个简单的CSV文件,如下所示,并将其内容放入2D数组中:

"","x","y","sim1","sim2","sim3","sim4","sim5","sim6","sim7","sim8","sim9","sim10","sim11","sim12"
"1",181180,333740,5.56588745117188,6.29487752914429,7.4835410118103,5.75873327255249,6.62183284759521,5.81478500366211,4.85671949386597,5.90418815612793,6.32611751556396,6.99649047851562,6.52076387405396,5.68944215774536
"2",181140,333700,6.36264753341675,6.5217604637146,6.16843748092651,5.55328798294067,7.00429201126099,6.43625402450562,6.17744159698486,6.72836923599243,6.38574266433716,6.81451606750488,6.68060827255249,6.14339065551758
"3",181180,333700,6.16541910171509,6.44704437255859,7.51744651794434,5.46270132064819,6.8890323638916,6.46842670440674,6.07698059082031,6.2140531539917,6.43774271011353,6.21923875808716,6.43355655670166,5.90692138671875
为此,我使用以下方法:

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1)
但我总是得到这样的信息:

"ValueError: could not convert string to float: "1"
我认为问题在于每行的第一列。所以,我试着在没有第一栏的情况下阅读,但我不知道怎么读


那么,我怎么能忽略第一列呢?有没有办法用第一列读取此文件?

您可以为任何列指定转换器

converters = {0: lambda s: float(s.strip('"')}
data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, converters=converters)
或者,您可以指定要使用的列,例如:

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, usecols=range(1,15))


在不知道列数的情况下跳过第一列的一种方法是手动从csv中读取列数。这很容易,尽管有时您可能需要对此进行调整以解释格式不一致*

with open("Data/sim.csv") as f:
    ncols = len(f.readline().split(','))

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, usecols=range(1,ncols+1))

*如果顶部有空行,则需要跳过它们。如果字段标题中可能有逗号,则应改为使用第一行数据对列进行计数。因此,如果您有特定的问题,我可以添加一些细节,使代码更加健壮。

尝试使用csv库读取csv文件

import csv

def someFunc(fname):
    with open(fname) as f:
    reader = csv.reader(f)

    i = 0
    header = True
    for row in reader:
        if header:
            header = False
            continue

        out[i] = [row[j] for j in range(len(columns))]
        i += 1
return out

out将具有2D数组。

您可以使用pandas并将其作为数据帧对象读取。如果知道不需要的列,只需在加载行中添加一个
。drop

a = pandas.read_csv("Data/sim.csv",sep=",")
a = a.drop(a.columns[0], axis=1)
第一行将作为标题读取,但您可以在read_csv参数中添加skiprows=1。
熊猫数据帧是numpy数组,因此,将列或矩阵转换为numpy数组非常简单

jmiloy和Deninhos的答案都很好。如果OP特别希望在NumPy数组中读取(与pandas dataframe相反),另一个简单的替代方法是在读取索引列后将其删除。当您知道索引列始终是第一列,但要素(列)的数量是灵活的时,这种方法就行了

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1)
data = np.delete(data, 0, axis = 1)

您可以指定使用
usecols
读取哪些列。我自己编写了
转换器
方法,但是OP不需要类似于
float(s.strip(“”)
)的东西吗?是的,我想知道第二种解决方案。但我不一定知道cols范围。有一种说法是“使用除第一列之外的每一列?如果有一个
dontusecols
,或者
usecols
可以获取一个切片对象而不仅仅是一个iterable(因此您可以只
usecols=slice(1,None)
,还可以使用
usecols=slice(-1)
跳过最后一行,等等,那就好了@abarnert同意。或者,如果您可以将每列的默认转换器设置为给出
nan
,而不是抛出错误。OP希望构建一个numpy数组,而不是列表列表。(而且,仅仅为了构建numpy数组而构建列表列表会稍微慢一些,并且会占用更多内存…这是人们首先使用numpy的主要原因之一。)在首次读取时不能使用drop part。只有在已经读取变量“a”中的csv文件时,上述方法才会起作用。
with open(filename, 'r') as csvfile:
    csvreader = csv.reader(csvfile, delimiter=',', quotechar='|')
    for row in csvreader:
        data.append(float(row[1]))