2015-09-22 55 views
3

我有以下格式的 「CSV」 數據文件(當然,這是相當一個TSV):如何讀取製表符分隔的CSV格式?

event pdg x y z t 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讀它(聲明使用熊貓的關鍵字參數),拋出一個異常:這些

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 

無工程和熊貓根本不使用。試圖推斷列名稱和類型的「嗅探器」僅從標準庫調用csv.Sniffer.sniff()(失敗)。

有沒有辦法如何正確閱讀這個文件(因爲它的「小兄弟」有幾百MB,我想用blaze的順序處理能力)?

感謝您的任何想法。

編輯:我想可能是里程/ CSV的問題,並提交了問題:https://github.com/blaze/odo/issues/327

EDIT2: 完整的錯誤:

 
Error Traceback (most recent call last) in() ----> 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  if isinstance(data, _strtypes): 
    55   data = resource(data, schema=schema, dshape=dshape, columns=columns, 
---> 56       **kwargs) 
    57  if (isinstance(data, Iterator) and 
    58    not isinstance(data, tuple(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   return self.dispatch(s)(s, *args, **kwargs) 
    65 
    66  @property 

/home/[username-hidden]/anaconda3/lib/python3.4/site-packages/odo/backends/csv.py in resource_csv(uri, **kwargs) 
    276 @resource.register('.+\.(csv|tsv|ssv|data|dat)(\.gz|\.bz2?)?') 
    277 def resource_csv(uri, **kwargs): 
--> 278  return 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   if has_header is None: 
    103    self.has_header = (not os.path.exists(path) or 
--> 104        infer_header(path, sniff_nbytes)) 
    105   else: 
    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   raw = f.read(nbytes) 
---> 60  return 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   # subtracting from the likelihood of the first row being a header. 
    393 
--> 394   rdr = reader(StringIO(sample), self.sniff(sample)) 
    395 
    396   header = next(rdr) # assume first row is header 

/home/[username-hidden]/anaconda3/lib/python3.4/csv.py in sniff(self, sample, delimiters) 
    187 
    188   if not delimiter: 
--> 189    raise Error("Could not determine delimiter") 
    190 
    191   class dialect(Dialect): 

Error: Could not determine delimiter 
+0

嗨,那裏。我相信這對我的系統有效。你得到的錯誤是什麼? – wgwz

+0

似乎像安裝dask改變了錯誤被報告給別的東西。我有點困惑。我現在就離開它,只用熊貓解析數據 - 我需要在幾個小時內完成分析。我稍後再回來。謝謝。 –

+0

查看我對帖子的編輯。您的列在純粹的熊貓分析中沒有正確解析。 – wgwz

回答

3

我與Python的工作 2.7.10,dask v0.7.1,烈焰 v0.8.2和conda v3.17.0。

conda install dask 
conda install blaze 

這裏是你可以導入使用的數據與殺出的方式。首先用pandas解析數據,然後將其轉換爲大火。也許這會打破目的,但這種方式沒有問題。

作爲一個方面說明,以分析數據文件中正確的在大熊貓行解析statment應該是:

​​

現在數據沒有錯誤,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

+0

相同的版本(最新的anaconda).. .Hm ... –

+0

Btw。Python 3.4 –

+0

Heureka!Dask是出路:-) –

相關問題