Numpy recarray 将字节文字标签写入我的 csv 文件?
Numpy recarray writes byte literals tags to my csv file?
我使用了下面的测试代码
import numpy as np
import csv
data = np.zeros((3,),dtype=("S24,int,float"))
with open("testtest.csv", 'w', newline='') as f:
writer = csv.writer(f,delimiter=',')
for row in data:
writer.writerow(row)
并且csv文件中的数据对于记录数组的字符串组件有b''标签(字节文字标签)。
处理写入这些记录数组的 csv 的正确方法是什么,以及避免在我的 csv 文件中包含字节文字标签的最佳方法是什么?
您需要所有这三种数据类型的数据吗?考虑在浮点数或整数的 numpy 数组上使用 numpy.savetxt()。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html
data = np.zeros((3,3))
filename='foo'
np.savetxt(filename+".csv",data,fmt='%1.6e',delimiter=",")
#fmt='%1.6e' controls how the numbers are written to the text file.
#E.g. use fmt='%d' for integers
我认为您正在使用 Python3,它使用 unicode 作为默认字符串类型。字节字符串然后得到特殊的 b
标记。
如果我使用 unicode 而不是字节生成数据,这有效:
In [654]: data1 = np.zeros((3,),dtype=("U24,int,float"))
In [655]: data1['f0']='xxx' # more interesting string field
In [656]: with open('test.csv','w') as f:
writer=csv.writer(f,delimiter=',')
for row in data1:
writer.writerow(row)
In [658]: cat test.csv
xxx,0,0.0
xxx,0,0.0
xxx,0,0.0
np.savetxt
做同样的事情:
In [668]: np.savetxt('test.csv',data1,fmt='%s',delimiter=',')
In [669]: cat test.csv
xxx,0,0.0
xxx,0,0.0
xxx,0,0.0
问题是,我可以在保留 S24
字段的同时解决这个问题吗?例如,将文件打开为 wb
?
我之前在 中探讨过这个问题
Trying to strip b' ' from my Numpy array
看来我的解决方案是 decode
字节字段,或者直接写入字节文件。由于您的数组混合了字符串和数字字段,因此 decode
解决方案有点乏味。
data1 = data.astype('U24,i,f') # convert bytestring field to unicode
辅助函数可用于动态 decode
字节字符串:
In [147]: fn = lambda row: [j.decode() if isinstance(j,bytes) else j for j in row]
In [148]: with open('test.csv','w') as f:
writer=csv.writer(f,delimiter=',')
for row in data:
writer.writerow(fn(row))
.....:
In [149]: cat test.csv
xxx,0,0.0
yyy,0,0.0
zzz,0,0.0
我使用了下面的测试代码
import numpy as np
import csv
data = np.zeros((3,),dtype=("S24,int,float"))
with open("testtest.csv", 'w', newline='') as f:
writer = csv.writer(f,delimiter=',')
for row in data:
writer.writerow(row)
并且csv文件中的数据对于记录数组的字符串组件有b''标签(字节文字标签)。 处理写入这些记录数组的 csv 的正确方法是什么,以及避免在我的 csv 文件中包含字节文字标签的最佳方法是什么?
您需要所有这三种数据类型的数据吗?考虑在浮点数或整数的 numpy 数组上使用 numpy.savetxt()。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html
data = np.zeros((3,3))
filename='foo'
np.savetxt(filename+".csv",data,fmt='%1.6e',delimiter=",")
#fmt='%1.6e' controls how the numbers are written to the text file.
#E.g. use fmt='%d' for integers
我认为您正在使用 Python3,它使用 unicode 作为默认字符串类型。字节字符串然后得到特殊的 b
标记。
如果我使用 unicode 而不是字节生成数据,这有效:
In [654]: data1 = np.zeros((3,),dtype=("U24,int,float"))
In [655]: data1['f0']='xxx' # more interesting string field
In [656]: with open('test.csv','w') as f:
writer=csv.writer(f,delimiter=',')
for row in data1:
writer.writerow(row)
In [658]: cat test.csv
xxx,0,0.0
xxx,0,0.0
xxx,0,0.0
np.savetxt
做同样的事情:
In [668]: np.savetxt('test.csv',data1,fmt='%s',delimiter=',')
In [669]: cat test.csv
xxx,0,0.0
xxx,0,0.0
xxx,0,0.0
问题是,我可以在保留 S24
字段的同时解决这个问题吗?例如,将文件打开为 wb
?
我之前在 中探讨过这个问题
Trying to strip b' ' from my Numpy array
看来我的解决方案是 decode
字节字段,或者直接写入字节文件。由于您的数组混合了字符串和数字字段,因此 decode
解决方案有点乏味。
data1 = data.astype('U24,i,f') # convert bytestring field to unicode
辅助函数可用于动态 decode
字节字符串:
In [147]: fn = lambda row: [j.decode() if isinstance(j,bytes) else j for j in row]
In [148]: with open('test.csv','w') as f:
writer=csv.writer(f,delimiter=',')
for row in data:
writer.writerow(fn(row))
.....:
In [149]: cat test.csv
xxx,0,0.0
yyy,0,0.0
zzz,0,0.0