2016-01-10 2 views
1

У меня есть пример кода, как указано ниже, считывая данные из базы данных sqlite и импортируя его в некоторый фрейм данных pandas.UnicodeEncodeError только на некоторых компьютерах

Когда я запустить его на своем рабочем столе, он печатает желаемый результат

Datenbank anlegen 
    Datum  Name 
0 160105 12351.3 

Однако, запустив его на моем ноутбуке, я получаю предупреждение Unicode:

2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] 
Python Type "help", "copyright", "credits" or "license" for more information. 
[evaluate 2016-01-10 Test PD.py] 
C:\Python27\lib\pkgutil.py:380: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 
    importer = sys.path_importer_cache[path_item] 
Traceback (most recent call last): 
    File "C:\Users\....\2016-01-10 Test PD.py", line 2, in <module> 
    import pandas as pd 
    File "C:\Python27\Lib\site-packages\pandas\__init__.py", line 13, in <module> 
    from pandas import hashtable, tslib, lib 
    File "C:\.....\pandas\tslib.pyx", line 61, in init pandas.tslib (pandas\tslib.c:103021) 
    File "C:\Python27\Lib\site-packages\pytz\__init__.py", line 31, in <module> 
    from pkg_resources import resource_stream 
    File "C:\Python27\Lib\site-packages\pkg_resources.py", line 2829, in <module> 
    working_set = WorkingSet._build_master() 
    File "C:\Python27\Lib\site-packages\pkg_resources.py", line 440, in _build_master 
    ws = cls() 
    File "C:\Python27\Lib\site-packages\pkg_resources.py", line 433, in __init__ 
    self.add_entry(entry) 
    File "C:\Python27\Lib\site-packages\pkg_resources.py", line 489, in add_entry 
    for dist in find_distributions(entry, True): 
    File "C:\Python27\Lib\site-packages\pkg_resources.py", line 1817, in find_distributions 
    importer = get_importer(path_item) 
    File "C:\Python27\Lib\pkgutil.py", line 387, in get_importer 
    importer = path_hook(path_item) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 44: ordinal not in range(128) 

Сценарий проходит через без ошибки на ноутбуке, когда я бегу через него шаг за шагом с моим отладчиком (wingide).

import sqlite3 as lite 
import pandas as pd 
import os 


db_filename = "Test.db" 

if not os.path.isfile(db_filename): 
    con = lite.connect(db_filename) 
    print "Datenbank anlegen" 
    try: 
     with con:  
      cur = con.cursor()  
      cur.execute("CREATE TABLE Testtab(Datum TEXT, Name TEXT)") 
      Datum= "160105" 
      Name= "12351.3*ABC" 
      cur.execute("INSERT INTO Testtab VALUES(?,?)",(Datum, Name)) 

    except lite.Error, e: 
     print "Error 1: %s:" % e.args[0] 
     sys.exit(1)  
con = lite.connect(db_filename)   

with con:  
    query = '''SELECT * 
       FROM Testtab''' 

    df = pd.read_sql(query, con)   


# DF konvertieren  
df['Name']=df['Name'].str[:-4].astype(float) 
print df 

панда и NumPy новее на ноутбуке (панды 0.17.1 вместо 0.15.2, Numpy 1.7.1 вместо 1.6.2).

Кажется, что данные записываются в базу данных sqlite как unicode, а pd.read_sql каким-то образом не нравится.

Немного потеряно здесь, любая помощь оценена.

Спасибо, Томас

+0

Звучит как разные наборы кодов на каждом, может даже быть шрифтом. Вы проверяли локали? – cdarke

+0

Это может быть связано с изменением версий, как вы упомянули. У меня была такая же проблема с картой поведения. Попробуйте запустить с pandas 0.15.2 версия – keya

+0

@cdark: теперь я добавил "import locale locale.setlocale (locale.LC_ALL, 'deu_deu')" на обоих компьютерах, ничего не меняет. Это то, что вы имеете в виду? – tfv

ответ

0

кажется, что добавление

import sys 
reload(sys) 
sys.setdefaultencoding("latin-1") 

решает эту проблему. К сожалению, я не могу правильно объяснить причину, я только понял, что setdefaultencoding является параметром, который по умолчанию не загружен, поэтому необходима перезагрузка.

Смежные вопросы