mon*_*962 9 python csv numpy delimiter
我有一个CSV文件,其格式如下所示:
"FieldName1","FieldName2","FieldName3","FieldName4"
"04/13/2010 14:45:07.008","7.59484916392","10","6.552373"
"04/13/2010 14:45:22.010 ","6.55478493312","9","3.5378543"
......
请注意,CSV文件中每行的开头和结尾都有双引号字符,该","字符串用于分隔每行中的字段.CSV文件中的字段数可能因文件而异.
当我尝试将其读入numpy via时:
import numpy as np
data = np.genfromtxt(csvfile, dtype=None, delimiter=',', names=True)
所有数据都以字符串值的形式读入,由双引号字符包围.这不是不合理的,但对我来说没什么用处,因为我必须返回并将每列转换为正确的类型
当我使用时delimiter='","',除了第一个和最后一个字段外,一切都按照我的意愿运行.由于行和行尾字符的开头是单个双引号字符,因此不会将其视为第1个和最后一个字段的有效分隔符,因此它们会被读入,例如,"04/13/2010 14:45:07.008并且6.552373"- 请注意前导和尾部双字符-分别引用字符.由于这些冗余字符,numpy假设第1个和最后一个字段都是字符串类型; 我不希望如此
是否有一种方法可以指示numpy按照我的方式读取以这种方式格式化的文件,而不必在初始读取后返回并"修复"numpy数组的结构?
Mik*_*one 12
基本问题是NumPy不理解剥离引号的概念(而csv模块的确如此).当你说delimiter='","',你告诉NumPy列分隔符实际上是一个带引号的逗号,即引号在逗号周围,而不是值,所以你得到的第一列和最后一列的额外引号是预期的.
查看函数文档,我认为你需要设置converters参数来为你去掉引号(默认不是):
import re
import numpy as np
fieldFilter = re.compile(r'^"?([^"]*)"?$')
def filterTheField(s):
m = fieldFilter.match(s.strip())
if m:
return float(m.group(1))
else:
return 0.0 # or whatever default
#...
# Yes, sorry, you have to know the number of columns, since the NumPy docs
# don't say you can specify a default converter for all columns.
convs = dict((col, filterTheField) for col in range(numColumns))
data = np.genfromtxt(csvfile, dtype=None, delimiter=',', names=True,
converters=convs)
Run Code Online (Sandbox Code Playgroud)
或者放弃np.genfromtxt()并让我们csv.csvreader一次一行地给你文件的内容,作为字符串列表,然后你只需遍历元素并构建矩阵:
reader = csv.csvreader(csvfile)
result = np.array([[float(col) for col in row] for row in reader])
# BTW, column headings are in reader.fieldnames at this point.
Run Code Online (Sandbox Code Playgroud)
编辑:好的,所以看起来你的文件不是所有花车.在这种情况下,您可以convs根据需要进行设置genfromtxt,或者在以下情况下创建转换函数向量csv.csvreader:
reader = csv.csvreader(csvfile)
converters = [datetime, float, int, float]
result = np.array([[conv(col) for col, conv in zip(row, converters)]
for row in reader])
# BTW, column headings are in reader.fieldnames at this point.
Run Code Online (Sandbox Code Playgroud)
编辑2:好的,可变列数...您的数据源只是想让生活变得困难.幸运的是,我们可以使用magic......
reader = csv.csvreader(csvfile)
result = np.array([[magic(col) for col in row] for row in reader])
Run Code Online (Sandbox Code Playgroud)
...这里magic()只是一个名字,我从头顶上找到了一个功能.(精神!)
在最坏的情况下,它可能是这样的:
def magic(s):
if '/' in s:
return datetime(s)
elif '.' in s:
return float(s)
else:
return int(s)
Run Code Online (Sandbox Code Playgroud)
也许NumPy有一个函数,它接受一个字符串并返回一个具有正确类型的单个元素. numpy.fromstring()看起来很近,但它可能会将时间戳中的空格解释为列分隔符.
PS csvreader我看到的一个缺点是它不会丢弃评论; 真实csv文件没有评论.
| 归档时间: |
|
| 查看次数: |
17304 次 |
| 最近记录: |