3

我有一个具有以下格式的“CSV”数据文件(嗯,它是一个 TSV):

事件 pdg xyzt px py pz ekin
3383 11 -161.515 5.01938e-05 -0.000187112 0.195413 0.664065 0.126078 -0.736968 0.00723234  
1694 11 -161.515 -0.000355633 0.000263174 0.195413 0.511853 -0.523429 0.681196 0.00472714  
4228 11 -161.535 6.59631e-06 -3.32796e-05 0.194947 -0.713983 -0.0265468 -0.69966 0.0108681   
4233 11 -161.515 -0.000524488 6.5069e-05 0.195413 0.942642 0.331324 0.0406377 0.017594

该文件可按原样解释pandas

from pandas import read_csv, read_table
data = read_csv("test.csv", sep="\t", index_col=False)     # Works
data = read_table("test.csv", index_col=False)             # Works

但是,当我尝试读取它blaze(声明使用 pandas 关键字参数)时,会引发异常:

from blaze import Data 
Data("test.csv")                             # Attempt 1
Data("test.csv", sep="\t")                   # Attempt 2
Data("test.csv", sep="\t", index_col=False)  # Attempt 3

这些都不起作用,pandas 根本没有使用。试图推断列名和类型的“嗅探器”只是csv.Sniffer.sniff()从标准库调用(失败)。

有没有办法在 blaze 中正确读取这个文件(鉴于它的“小兄弟”有几百 MB,我想使用 blaze 的顺序处理能力)?

感谢您的任何想法。

编辑:我认为这可能是 odo/csv 的问题并提出了问题:https ://github.com/blaze/odo/issues/327

Edit2: 完全错误:

() ----> 1 bz.Data("test.csv", sep="\t", index_col=False) 中的错误回溯(最后一次调用)

/home/[username-hidden]/anaconda3/lib/python3.4/site-packages/blaze/interactive.py in Data(data, dshape, name, fields, columns, schema, **kwargs)
     54 如果是实例(数据,_strtypes):
     55 数据=资源(数据,模式=模式,dshape=dshape,列=列,
---> 56 **kwargs)
     57 if (isinstance(data, Iterator) 和
     58 不是实例(数据,元组(not_an_iterator))):

/home/[username-hidden]/anaconda3/lib/python3.4/site-packages/odo/regex.py in __call__(self, s, *args, **kwargs)
     62
     63 def __call__(self, s, *args, **kwargs):
---> 64 返回 self.dispatch(s)(s, *args, **kwargs)
     65
     66 @属性

/home/[username-hidden]/anaconda3/lib/python3.4/site-packages/odo/backends/csv.py in resource_csv(uri, **kwargs)
    第276章
    第277章
--> 278 返回 CSV(uri, **kwargs)
    279
    280

/home/[username-hidden]/anaconda3/lib/python3.4/site-packages/odo/backends/csv.py in __init__(self, path, has_header, encoding, sniff_nbytes, **kwargs)
    102 如果 has_header 为无:
    103 self.has_header = (不是 os.path.exists(path) 或
--> 104 infer_header(路径, sniff_nbytes))
    105 其他:
    106 self.has_header = has_header

/home/[username-hidden]/anaconda3/lib/python3.4/site-packages/odo/backends/csv.py in infer_header(path, nbytes, encoding, **kwargs)
     58 with open_file(path, 'rb') as f:
     59 原始 = f.read(nbytes)
---> 60 返回 csv.Sniffer().has_header(raw if PY2 else raw.decode(encoding))
     61
     62

/home/[username-hidden]/anaconda3/lib/python3.4/csv.py in has_header(self, sample)
    392 # 从第一行作为标题的可能性中减去。
    393
--> 394 rdr = reader(StringIO(sample), self.sniff(sample))
    395
    396 header = next(rdr) # 假设第一行是标题

/home/[username-hidden]/anaconda3/lib/python3.4/csv.py in sniff(self, sample, delimiters)
    187
    188 如果不是分隔符:
--> 189 引发错误(“无法确定分隔符”)
    190
    191类方言(方言):

错误:无法确定分隔符
4

1 回答 1

3

我正在使用Python 2.7.10、dask v0.7.1、blaze v0.8.2 和conda v3.17.0。

conda install dask
conda install blaze

这是一种导入数据以供blaze使用的方法。首先用pandas解析数据,然后将其转换为blaze。也许这违背了目的,但这样就没有麻烦了。

作为旁注,为了正确解析数据文件,您在 pandas 解析语句中的行应该是:

from blaze import Data
from pandas import DataFrame, read_csv
data = read_csv("csvdata.dat", sep="\s*", index_col=False)
bdata = Data(data)

现在数据格式正确,没有错误,bdata

   event  pdg        x         y         z         t        px        py  \
0   3383   11 -161.515  0.000050 -0.000187  0.195413  0.664065  0.126078   
1   1694   11 -161.515 -0.000356  0.000263  0.195413  0.511853 -0.523429   
2   4228   11 -161.535  0.000007 -0.000033  0.194947 -0.713983 -0.026547   
3   4233   11 -161.515 -0.000524  0.000065  0.195413  0.942642  0.331324   

     pz      ekin  
0 -0.736968  0.007232  
1  0.681196  0.004727  
2 -0.699660  0.010868  

这是另一种选择,使用 dask,它可能可以执行您正在寻找的相同分块或大规模处理。Dask 确实可以立即轻松地正确加载 tsv 格式。

In [17]: import dask.dataframe as dd

In [18]: df = dd.read_csv('tsvdata.txt', sep='\t', index_col=False)

In [19]: df.head()
Out[19]: 
   event  pdg        x         y         z         t        px        py  \
0   3383   11 -161.515  0.000050 -0.000187  0.195413  0.664065  0.126078   
1   1694   11 -161.515 -0.000356  0.000263  0.195413  0.511853 -0.523429   
2   4228   11 -161.535  0.000007 -0.000033  0.194947 -0.713983 -0.026547   
3   4233   11 -161.515 -0.000524  0.000065  0.195413  0.942642  0.331324   
4    854   11 -161.515  0.000032  0.000418  0.195414  0.675752  0.315671   

         pz      ekin  
0 -0.736968  0.007232  
1  0.681196  0.004727  
2 -0.699660  0.010868  
3  0.040638  0.017594  
4 -0.666116  0.012641  

In [20]:

另见:http ://dask.pydata.org/en/latest/array-blaze.html#how-to-use-blaze-with-dask

于 2015-09-22T14:18:51.683 回答