2012-12-03 18 views
8

मेरे पास यूटीएफ -16 में एन्कोडेड एक सीएसवी टेक्स्ट फ़ाइल है (ताकि यूनिकोड वर्णों को संरक्षित किया जा सके जब अन्य एक्सेल का उपयोग करें) लेकिन पांडस 0.9.0 के साथ read_csv करते समय, मुझे यह गुप्त त्रुटि मिलती है:पांडस read_csv और यूटीएफ -16

df = pd.read_csv('data.txt',encoding='utf-16',sep='\t',header=0) 
df.head() 

--------------------------------------------------------------------------- 
Exception         Traceback (most recent call last) 
<ipython-input-18-85da1383cd9e> in <module>() 
----> 1 df = pd.read_csv('candidates-spanish.txt',encoding='utf-16',sep='\t',header=0) 
    2 df.head() 

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.pyc in read_csv(filepath_or_buffer, sep, dialect, header, index_col, names, skiprows, na_values, keep_default_na, thousands, comment, parse_dates, keep_date_col, dayfirst, date_parser, nrows, iterator, chunksize, skip_footer, converters, verbose, delimiter, encoding, squeeze, **kwds) 
248   kdict['delimiter'] = sep 
249 
--> 250  return _read(TextParser, filepath_or_buffer, kdict) 
251 
252 @Appender(_read_table_doc) 

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.pyc in _read(cls, filepath_or_buffer, kwds) 
198   return parser 
199 
--> 200  return parser.get_chunk() 
201 
202 @Appender(_read_csv_doc) 

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.pyc in get_chunk(self, rows) 
853   elif not self._has_complex_date_col: 
854    index = self._get_simple_index(alldata, columns) 
--> 855    index = self._agg_index(index) 
856 
857   elif self._has_complex_date_col: 

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/parsers.pyc in _agg_index(self, index, try_parse_dates) 
980     arr, _ = _convert_types(arr, col_na_values) 
981     arrays.append(arr) 
--> 982    index = MultiIndex.from_arrays(arrays, names=self.index_name) 
983   return index 
984 

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/index.pyc in from_arrays(cls, arrays, sortorder, names) 
1570 
1571   return MultiIndex(levels=levels, labels=labels, 
-> 1572       sortorder=sortorder, names=names) 
1573 
1574  @classmethod 

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/index.pyc in __new__(cls, levels, labels, sortorder, names) 
1254   assert(len(levels) == len(labels)) 
1255   if len(levels) == 0: 
-> 1256    raise Exception('Must pass non-zero number of levels/labels') 
1257 
1258   if len(levels) == 1: 

Exception: Must pass non-zero number of levels/labels 

में पंक्ति-दर-पंक्ति csv.reader साथ this example के आधार पर संकेत मिलता है कि अपने डेटा का प्रारूप गलत नहीं किए गए डेटा पढ़ना:

from io import BytesIO 
import csv 

with open('data.txt','rb') as f: 
    r = f.read().decode('utf-16').encode('utf-8') 
    for l in csv.reader(BytesIO(r),delimiter='\t'): 
     print l 

['Country', 'State/City', 'Title', 'Date', 'Catalogue', 'Wikipedia Election Page', 'Wikipedia Individual Page', 'Electoral Institution in Country', 'Twitter', 'CANDIDATE NAME 1', 'CANDIDATE NAME 2'] 
['Venezuela', 'N/A', 'President', '10/7/12', 'Hugo Rafael Chavez Frias', 'Hugo Ch\xc3\xa1vez', 'Hugo Ch\xc3\xa1vez', 'Hugo Chavez', 'Hugo Ch\xc3\xa1vez Fr\xc3\xadas', 'Hugo Chavez', 'Hugo Ch\xc3\xa1vez'] 
['Venezuela', 'N/A', 'President', '10/7/12', 'Henrique Capriles Radonski', 'Henrique Capriles Radonski', 'Henrique Capriles Radonski', 'Henrique Capriles Radonski', 'Henrique Capriles R.', 'Henrique Capriles', ''] 

वहाँ कुछ पूर्व प्रसंस्करण read_csv में एक अतिरिक्त विकल्प है, , या कि pandas.read_csv से पहले किया जाना चाहिए कुछ और एक UTF-16 फ़ाइल पढ़ सकते हैं? धन्यवाद!

+0

आप पोस्ट/पाठ फ़ाइल का एक संस्करण ईमेल कर सकते हैं? मैं एक नजर मार लूगां। –

+0

http://www.brianckeegan.com/data/candidates-spanish.txt –

उत्तर

8

परीक्षण कर सकते हैं यह एक बग है मुझे लगता है कि क्योंकि सीएसवी पाठक शुरुआत में वापस एक अतिरिक्त खाली पंक्ति गुजर रहा था। यह अजगर 2.7.3 पर मेरे लिए काम किया है और 0.9.1 पांडा अगर मैं कार्य करें:

In [36]: pd.read_csv(BytesIO(fh.read().decode('UTF-16').encode('UTF-8')), sep='\t', header=0) 
Out[36]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 50 entries, 0 to 49 
Data columns: 
Country        43 non-null values 
State/City       43 non-null values 
Title        43 non-null values 
Date        43 non-null values 
Catalogue       43 non-null values 
Wikipedia Election Page    43 non-null values 
Wikipedia Individual Page   43 non-null values 
Electoral Institution in Country 43 non-null values 
Twitter        43 non-null values 
CANDIDATE NAME 1     43 non-null values 
CANDIDATE NAME 2     16 non-null values 
dtypes: object(11) 

मैं यहाँ बग रिपोर्ट: https://github.com/pydata/pandas/issues/2418 GitHub पर गुरु यह दुर्भाग्य सी पार्सर में एक segfault कारण बनता है। हम इसे ठीक करेंगे।

अब, दिलचस्प है: https://softwareengineering.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful;)

+0

तो एक्सेल UTF-8 के साथ अच्छी तरह खेला जाता है, तो मुझे लगता है कि प्रयोग करेंगे! :) –

+1

सभी Git मास्टर –

+0

में अब सेट @BrianKeegan एक्सेल पहले से ही उपयोग करना बंद कर: p –

2
from StringIO import StringIO 
import pandas as pd 

a = ['Venezuela', 'N/A', 'President', '10/7/12', 'Hugo Rafael Chavez Frias', 'Hugo Ch\xc3\xa1vez', 'Hugo Ch\xc3\xa1vez', 'Hugo Chavez', 'Hugo Ch\xc3\xa1vez Fr\xc3\xadas', 'Hugo Chavez', 'Hugo Ch\xc3\xa1vez'] 

pd.read_csv(StringIO('\t'.join(a)), delimiter='\t') 

यहाँ काम करता है अपने डेटा के सिर अपलोड कर सकते हैं तो मैं

4

python3:

with open('data.txt',encoding='UTF-16') as f: 
    df = pd.read_csv(f) 
+0

आप 'एन्कोडिंग पारित कर सकते हैं = 'UTF-16'' सीधे' pd.read_csv करने के लिए() 'अब, तो' की कोई आवश्यकता नहीं खुला() '। –