使用Python将文件加载到NumPy数组中

6

我对Python还不是很熟悉,正在尝试通过复制我写过的一些matlab代码来学习。在matlab中,有一个部分是加载一个用Tab分隔的数据文件。语法如下:

x = load(data.txt)

将制表符分隔的数据放入标记为x的矩阵单元格中。
请问在Python中是否有一种方法可以使用逗号分隔的数据来实现这一点?
5个回答

17

有几种方法,选择最适合您的应用程序。

如果您正在使用 numpy,建议使用numpy的 loadloadtxtfromfilegenfromtxt 函数,因为在预处理后,文件将加载到一个合适的结构中。

但是,如果您不打算使用numpy(或任何其他具有一些文件加载功能的大型库),那么仅为了加载文件使用它会有些过头了……考虑使用内置的Python函数,或者标准库中的csv模块代替…这将更加灵活,而且更加顺畅。

以下是如何执行操作的示例,使用file.txt(每行的值用制表符分隔):

1   2   3   4
7   8   9   10  11  12
13  14  15

Python内置模块

无需导入任何模块,非常简单、灵活,对于大多数情况都是一个不错的选择。

以二进制模式读取文件(使用rb标志),使用仅有的内置函数将其加载到表格中(值的列表嵌套列表,在文件中使用制表符分隔):

>>> file = open('file.txt', 'rb')
>>> table = [row.strip().split('\t') for row in file]

CSV

标准库中的csv模块也非常简单易用。

需要注意的是,虽然CSV意味着逗号分隔值,但实际上并没有标准,您可以选择任何分隔符。因此,CSV适用于所有面向单元格或类似表格的文件。

使用csv reader在二进制模式下读取文件(使用rb标志),将其加载到表格中(列表的列表,其中每个值都用制表符分隔):

>>> import csv
>>> file = open('file.txt', 'rb')
>>> data = csv.reader(file, delimiter='\t')
>>> table = [row for row in data]

访问单元格

这个表格的加载方式与前两个示例类似,可以像这样访问表格中的数据:table[row][col]

>>> table
[['1', '2', '3', '4'], ['7', '8', '9', '10', '11', '12'], ['13', '14', '15']]    
>>> table[0]
['1', '2', '3', '4']
>>> table[1][2]
9

11
如果您想使用Python进行类似MATLAB的操作,您需要使用NumPy(和scipy);特别是,您应该阅读NumPy for MATLAB Users
如果您有逗号分隔的数据,您可以使用numpy.loadtxt来读取它(当然,在安装numpy之后)。
$ cat matrix.csv 
1,2,3
4,5,6
7,8,9

然后

>>> import numpy as np
>>> m = np.loadtxt("matrix.csv", delimiter=",")
>>> m
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.],
       [ 7.,  8.,  9.]])
>>> np.matrix(m)
matrix([[ 1.,  2.,  3.],
        [ 4.,  5.,  6.],
        [ 7.,  8.,  9.]])

2

标准库中有一个csv模块。

点击这里查看文档

>>> import csv
>>> spamReader = csv.reader(open('eggs.csv', 'rb'), delimiter=' ', quotechar='|')
>>> for row in spamReader:
...     print ', '.join(row)
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam

2
只是一点提醒,源文件必须在二进制模式下打开这一事实,我认为应该明确指出(而不是让某人认为二进制或文本模式都可以);如果不这样做,可能会出现与换行符相关的错误。 - JAB

2
numpy.loadtxt函数将ASCII文件中的数据读入numpy数组中。可以使用delimiter参数定义用于分隔值的字符串:
numpy.loadtxt('data.txt', delimiter=',')

对于更加复杂的情况,numpy.genfromtxt 函数是一个非常好的替代方案。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接