首页 文章

将应用程序切换到Unicode

提问于
浏览
1

我的model.py看起来像:

import csv

with open("organizationTest.txt","rU") as f:
        reader = csv.reader(f)
        for row in reader:
            _, created = Company.objects.get_or_create(
                Name=row[0],
                Site=row[1],
                )

“名称”和“网站”都在模型中描述!

每当我尝试运行我的服务器时,我都会得到

django.db.utils.ProgrammingError:除非使用可解释8位字节串的text_factory(如text_factory = str),否则不得使用8位字节串 . 强烈建议您只需将应用程序切换为Unicode字符串 .

我怎么能像我们说的那样将我的应用程序切换到Unicode字符串,或者如果有任何其他方法可以解决这个问题,我很想知道!

我很乐意回答任何问题!先感谢您!

EDIT: Here is the full error:

Traceback(最近一次调用最后一次):文件“manage.py”,第10行,在execute_from_command_line(sys.argv)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages /django/core/management/init.py“,第338行,在execute_from_command_line utility.execute()文件”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core /management/init.py“,第312行,执行django.setup()文件”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/init.py“,第18行,在安装程序apps.populate(settings.INSTALLED_APPS)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/apps/registry.py”,第108行,填充app_config.import_models(all_models)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/apps/config.py”,第198行,in import_models self.models_module = import_module(models_module_name)文件“/Library/Frameworks/Python.framework/Versions/2 .7 / lib / python2.7 / importlib / init.py“,第37行,在import_module导入(名称)文件”/Users/aghodsib/Desktop/soroush_programming/Python/slik/companies/models.py“,第58行,在description = row [15],文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/manager.py”,第127行,在manager_method中返回getattr(self.get_queryset(),name)(* args,** kwargs)File“/ Library / Frameworks / Python.framework / Version / 7.7 / lib / python2.7 / site-packages / django / db / model / query .py“,第405行,在get_or_create中返回self.get(**查找),False文件”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models /query.py“,第328行,在get num = len(clone)文件”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query . py“,第144行,在len self._fetch_all()文件”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py“,行965,在_fetch_all self中 . _result_cache = list(self.iterator())文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py”,第238行,in iterator results = compiler.execute_sql()File“/ Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/compiler.py”,第837行,in execute_sql cursor.execute(sql,params)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/backends/utils.py”,第79行,执行return super(CursorDebugWrapper,self).execute(sql,params)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/backends/utils.py”,第64行,在执行中返回self.cursor.execute(sql,params)文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/utils.py”,第97行,在exit.6.reraise(dj_exc_type,dj_exc_value,traceback)文件中“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages /django/db/backends/utils.py“,第64行,在执行中返回self.cursor.execute(sql,params)文件”/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site -packages / django / db / backends / sqlite3 / base.py“,第318行,执行返回Database.Cursor.execute(self,query,params)django.db.utils.ProgrammingError:你不能使用8位字节串除非你使用一个可以解释8位字节串的text_factory(比如text_factory = str) . 强烈建议您只需将应用程序切换为Unicode字符串 .

3 回答

  • 0

    您似乎从一个不寻常的编解码器获取字符 .
    csv文件的来源应该能够告诉你他们正在使用什么 .
    但是,您可以像这样从一个编解码器转换到另一个编解码器:

    import csv
    
    with open("organizationTest.txt","rU") as f:
            reader = csv.reader(f)
            for row in reader:
                _, created = Company.objects.get_or_create(
                    Name=row[0].decode('latin-1').encode('utf8'),
                    Site=row[1].decode('latin-1').encode('utf8'),
                    )
    

    我建议你尝试一下 . 如果仍然无效,请联系csv的创建者文件 .

  • 1

    来自Python CSV docs

    csv模块不直接支持读取和写入Unicode,但除了ASCII NUL字符的某些问题外,它还是8位清除 . 因此,只要您避免使用像UTF-16这样使用NUL的编码,您就可以编写处理编码和解码的函数或类 . 建议使用UTF-8 . 下面的unicode_csv_reader()是一个包装csv.reader以处理Unicode CSV数据(Unicode字符串列表)的生成器 .

    import csv
    
    def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
        # csv.py doesn't do Unicode; encode temporarily as UTF-8:
        csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
                                dialect=dialect, **kwargs)
        for row in csv_reader:
            # decode UTF-8 back to Unicode, cell by cell:
            yield [unicode(cell, 'utf-8') for cell in row]
    
    def utf_8_encoder(unicode_csv_data):
        for line in unicode_csv_data:
            yield line.encode('utf-8')
    
    
    with open("organizationTest.txt","rU") as f:
            reader = unicode_csv_reader(f)
            for row in reader:
                _, created = Company.objects.get_or_create(
                    Name=row[0],
                    Site=row[1],
                    )
    
  • 1

    试试这个:

    import csv
    
    with open("organizationTest.txt","rU") as f:
            reader = csv.reader(f)
            for row in reader:
                _, created = Company.objects.get_or_create(
                    Name=unicode(row[0]),
                    Site=unicode(row[1]),
                    )
    

相关问题