Не понимаю ошибки в кодировке UTF в Python - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время я борюсь с указанием того, что пытается сказать мне эта ошибка. Я не могу сказать, относится ли это к некоторым данным, которые я ввел, или к словарю данных, которые я создал. Мне трудно даже сформулировать вопрос, который меня так смущает.

Traceback (most recent call last):
  File "push data.py", line 78, in <module>
   uploadFile(filename, uri, dbname)
  File "push data.py", line 69, in uploadFile
   docs = upload(db,docs)
  File "push data.py", line 27, in upload
   db.bulk_save(docs)
  File "C:\Python27\lib\site-packages\couchdbkit\client.py", line 564, in save_docs
payload=payload, **params).json_body
  File "C:\Python27\lib\site-packages\restkit\resource.py", line 144, in post
headers=headers, params_dict=params_dict, **params)
  File "C:\Python27\lib\site-packages\couchdbkit\resource.py", line 105, in request
payload = json.dumps(payload).encode('utf-8')
  File "C:\Python27\lib\json\__init__.py", line 244, in dumps
return _default_encoder.encode(obj)
  File "C:\Python27\lib\json\encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
  File "C:\Python27\lib\json\encoder.py", line 270, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 3: invalid start byte

EDIT

Вот мой код, я фактически украл его из первого ответа на этот вопрос -> Как импортировать данные CSV / TSV в Couch DB? . Моя проблема заключается в попытке найти документацию, чтобы убедиться, что я не делаю ничего плохого с моей стороны. Если кто-нибудь знает, где я могу найти документацию по couchdbkit, это было бы здорово! Их официальный сайт не работает.

#!/usr/bin/env python

from couchdbkit import Server, Database
from couchdbkit.loaders import FileSystemDocsLoader
from csv import DictReader
import sys, subprocess, math, os



def parseDoc(doc):
    for k,v in doc.items():
        if (isinstance(v,str)):
            print k, v, v.isdigit()
            # #see if this string is really an int or a float
            if v.isdigit()==True: #int
                doc[k] = int(v)
            else: #try a float
                try:
                    if math.isnan(float(v))==False:
                        doc[k] = float(v) 
                except:
                    pass            
    return doc


def upload(db, docs):
    db.bulk_save(docs)
    del docs
    return list()


def uploadFile(fname, uri, dbname):


  print 'Upload contents of %s to %s/%s' % (fname, uri, dbname)

  # #connect to the db
  theServer = Server(uri)
  db = theServer.get_or_create_db(dbname)

  #loop on file for upload
  reader = DictReader(open(fname, 'rU'), dialect = 'excel')  #see the python csv module 
         #for other options, such as using the tab delimeter. The first line in your csv 
         #file should contain all of the "key" and all subsequent lines hold the values 
         #for those keys.

  #used for bulk uploading
  docs = list()
  checkpoint = 100

  for doc in reader:
    newdoc = parseDoc(doc) #this just converts strings that are really numbers into ints and floats

    #Here I check to see if the doc is already on the database. If it is, then I assign
    #the _rev key so that it updates the doc on the db.
    print('\n')
    print(newdoc)
    print('\n')

    if db.doc_exist(newdoc.get('_id')):
      newdoc['_rev'] = db.get_rev(newdoc.get('_id'))

    docs.append(newdoc)

    if len(docs)%checkpoint==0:
      docs = upload(db,docs)

  #don't forget the last batch        
  docs = upload(db,docs)



if __name__=='__main__':
  filename = "Kardiology Data.csv"
  uri = "http://localhost:5984"
  dbname = "kardiology"

  uploadFile(filename, uri, dbname)

1 Ответ

0 голосов
/ 03 мая 2018

есть проблема:

reader = DictReader(open(fname, 'rU'), dialect = 'excel')

попробуйте добавить кодировку UTF-8:

reader = DictReader(open(fname, 'rU'),encoding='utf-8', dialect = 'excel')
...