【发布时间】:2011-02-21 00:16:08
【问题描述】:
我在 python 中读取由制表符分隔的 csv 文件时遇到问题。我使用以下功能:
def csv2array(filename, skiprows=0, delimiter='\t', raw_header=False, missing=None, with_header=True):
"""
Parse a file name into an array. Return the array and additional header lines. By default,
parse the header lines into dictionaries, assuming the parameters are numeric,
using 'parse_header'.
"""
f = open(filename, 'r')
skipped_rows = []
for n in range(skiprows):
header_line = f.readline().strip()
if raw_header:
skipped_rows.append(header_line)
else:
skipped_rows.append(parse_header(header_line))
f.close()
if missing:
data = genfromtxt(filename, dtype=None, names=with_header,
deletechars='', skiprows=skiprows, missing=missing)
else:
if delimiter != '\t':
data = genfromtxt(filename, dtype=None, names=with_header, delimiter=delimiter,
deletechars='', skiprows=skiprows)
else:
data = genfromtxt(filename, dtype=None, names=with_header,
deletechars='', skiprows=skiprows)
if data.ndim == 0:
data = array([data.item()])
return (data, skipped_rows)
问题是 genfromtxt 抱怨我的文件,例如出现错误:
Line #27100 (got 12 columns instead of 16)
我不确定这些错误来自哪里。有任何想法吗?
这是导致问题的示例文件:
#Gene 120-1 120-3 120-4 30-1 30-3 30-4 C-1 C-2 C-5 genesymbol genedesc
ENSMUSG00000000001 7.32 9.5 7.76 7.24 11.35 8.83 6.67 11.35 7.12 Gnai3 guanine nucleotide binding protein alpha
ENSMUSG00000000003 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 Pbsn probasin
有没有更好的方法来编写通用的 csv2array 函数?谢谢。
【问题讨论】:
-
看来,当它到达文件的第三行时,它认为有 16 列(出于某种原因基于第 2 行),然后拒绝该文件。知道为什么第 2 行的最后一个字段会这样解释吗?它没有制表符,只有空格,但它似乎将第 2 行最后一个字段中的每个单词解释为一个列字段。
-
您的解析器必须将空格解释为分隔符。我不确定 genfromtxt 做了什么,但如果它正在构建一个数组,如果你给它提供比以前任何其他更大的行,它可能会默默地扩展自己,但是当它变得更小时会生气。在任何情况下,如果您要处理潜在的未知数据,使用
csv模块会更加稳健。 -
但是我怎样才能稳健地从 csv 转到数组?
-
您是否尝试将 '\t' 指定为 genfromtxt 的分隔符?
标签: python csv numpy matplotlib scipy