我的文件看起来像这样:
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]])