np.genfromtxt 多个分隔符?



我的文件看起来像这样:

1497484825;34425;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14
1497484837;34476;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14;-4,28,-14

我想使用 np.genfromtxt 将其导入 numpy 数组。最大的问题是它有";"和","作为分隔符。 我的尝试:

import numpy as np
import io
s = io.StringIO(open('2e70dfa1.csv').read().replace(';',','))
data = np.genfromtxt(s,dtype=int,delimiter=',')

我收到错误:

类型错误:无法将"字节"对象隐式转换为 str

如何解决?我也对全新的(更好的)想法持开放态度。

根据文档:

参数
fname: file, str, pathlib.路径、str 列表、生成器 要读取的文件、文件名、列表或生成器。如果文件扩展名 为 gz 或 bz2,文件首先解压缩。请注意,生成器 必须在 Python 3k 中返回字节字符串。列表中的字符串或 由发电机产生的被视为线。

给它一个生成器可能更容易和更有效,只是记住它必须产生字节字符串:

>>> with open('2e70dfa1.csv', 'rb') as f:
...     clean_lines = (line.replace(b';',b',') for line in f)
...     data = np.genfromtxt(clean_lines, dtype=int, delimiter=',')
...
>>> data
array([[1497484825,      34425,         -4,         28,        -14,
-4,         28,        -14,         -4,         28,
-14,         -4,         28,        -14,         -4,
28,        -14,         -4,         28,        -14],
[1497484837,      34476,         -4,         28,        -14,
-4,         28,        -14,         -4,         28,
-14,         -4,         28,        -14,         -4,
28,        -14,         -4,         28,        -14]])

根据 numpy.genfromtxt 的文档:

请注意,生成器必须在 Python 3k 中返回字节字符串。

因此,与其创建StringIO对象,不如创建一个BytesIO

import numpy as np 
import io
s = io.BytesIO(open('2e70dfa1.csv', 'rb').read().replace(b';',b','))
data = np.genfromtxt(s,dtype=int,delimiter=',')

收益 率

array([[1497484825,      34425,         -4,         28,        -14,
-4,         28,        -14,         -4,         28,
-14,         -4,         28,        -14,         -4,
28,        -14,         -4,         28,        -14],
[1497484837,      34476,         -4,         28,        -14,
-4,         28,        -14,         -4,         28,
-14,         -4,         28,        -14,         -4,
28,        -14,         -4,         28,        -14]])

请注意,如果您安装了 Pandas,您可以使用允许您指定正则表达式模式作为分隔符的pd.read_table

import pandas as pd     
df = pd.read_table('2e70dfa1.csv', sep=';|,', engine='python', header=None)
print(df)

收益 率

0      1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19
0  1497484825  34425  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14
1  1497484837  34476  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14  -4  28 -14

pd.read_table返回一个数据帧。如果你需要一个 NumPy 数组,你可以通过它的values属性访问它:

In [24]: df.values
Out[24]: 
array([[1497484825,      34425,         -4,         28,        -14,
-4,         28,        -14,         -4,         28,
-14,         -4,         28,        -14,         -4,
28,        -14,         -4,         28,        -14],
[1497484837,      34476,         -4,         28,        -14,
-4,         28,        -14,         -4,         28,
-14,         -4,         28,        -14,         -4,
28,        -14,         -4,         28,        -14]])

相关内容

  • 没有找到相关文章

最新更新