使用numpy读取文件到Python中

-1 投票
1 回答
2608 浏览
提问于 2025-04-18 15:17

这可能是个新手问题,因为我对Python的经验不多。我有一个.dat文件,已经把它转换成了.csv文件,现在想在Python中读取这个文件。这应该很简单,因为numpy有一个内置的函数可以做到这一点。我的代码是:

import numpy as np
import csv

d = np.loadtxt('scl1.csv', delimiter="\t")

我遇到的错误提示说无法将字符串转换为浮点数。我该怎么解决这个问题呢?为了让你们更明白,数据文件有6列,每个条目都是一个数字(比如7.33390715197523163E-002),它们之间用制表符分隔。我原以为问题可能出在某些数字中的E上,但我检查过了,numpy可以把它读作浮点数。非常感谢任何帮助。

我编辑了内容,加入了具体的错误信息,希望能有所帮助:

Traceback (most recent call last):
  File "/Applications/Python 3.4/Markov Chain/Monte Carlo.py", line 10, in <module>
    d = np.loadtxt('scl2.dat', delimiter="\t")
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numpy/lib/npyio.py", line 848, in loadtxt
    items = [conv(val) for (conv, val) in zip(converters, vals)]
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/numpy/lib/npyio.py", line 848, in <listcomp>
    items = [conv(val) for (conv, val) in zip(converters, vals)]
ValueError: could not convert string to float: b'   7.33390715197523163E-002  7.68126324487871659E-002  5.46056179421958582E-002  -22.791933511352461        8.7787362443778942       -3.6715272730208461     '

1 个回答

1

loadtxt()这个函数假设文件里全是浮点数,但你的.csv文件里可能有列标题是字符串,所以就出现了转换错误。

如果你的csv文件里只有数字,没有引号,可以通过跳过文件的第一行来忽略列名。

np.loadtxt('scl1.csv', delimiter='\t', skiprows=1)

或者,如果你想同时获取列标题的话:

DELIM = '\t'
fh = open('scl1.csv')
headers = fh.readline().strip().split(DELIM)
data = np.loadtxt(fh, delimiter=DELIM)

另外,你也可以使用csv模块,然后自己转换数据类型。

read_csv = csv.reader(open('scl1.csv'))
for fields in read_csv:
     pass # process fields list, which are all strings, and includes the col names

还有一个小建议:如果可以的话,尽量不要用'l'和'1'同时命名变量!

撰写回答