【问题标题】:Switch Application to Unicode将应用程序切换到 Unicode
【发布时间】:2015-09-04 15:37:42
【问题描述】:

我的 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 位字节串,除非你使用可以解释 8 位字节串的 text_factory(比如 text_factory = str)。强烈建议您将应用程序切换为 Unicode 字符串。

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

我很乐意回答任何问题!提前谢谢!

编辑:这是完整的错误:

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 实用程序.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 行,在 import_models self.models_module = import_module(models_module_name) import_module 中的文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/init.py”,第 37 行 进口(名称) 文件“/Users/aghodsib/Desktop/soroush_programming/Python/slik/companies/models.py”,第 58 行,在 描述=行[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) 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py”,第 405 行,在 get_or_create 返回 self.get(**lookup), False 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py”,第 328 行,在获取 num = len(克隆) len 中的文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py”,第 144 行 self._fetch_all() _fetch_all 中的文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py”,第 965 行 self._result_cache = list(self.iterator()) 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py”,第 238 行,在迭代器中 结果 = compiler.execute_sql() 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/compiler.py”,第 837 行,在 execute_sql cursor.execute(sql,参数) 文件“/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) exit 中的文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/utils.py”,第 97 行 六.reraise(dj_exc_type,dj_exc_value,回溯) 文件“/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 位字节串的 text_factory(如 text_factory = str),否则不得使用 8 位字节串。强烈建议您将应用程序切换为 Unicode 字符串。

【问题讨论】:

  • 该错误并非来自 Django 本身。请发布完整的回溯,以便我们在上下文中查看问题。
  • 我已经添加了完整的错误!
  • 试试 Name=row[0].decode('UTF-8')
  • 我得到:“UnicodeDecodeError: 'utf8' codec can't decode byte 0xcc in position 0: invalid continuation byte”
  • 在这种情况下 Name=row[0].decode('cp1252')

标签: python django python-2.7 unicode django-models


【解决方案1】:

您似乎从不寻常的编解码器中获取字符。
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 文件的创建者。

【讨论】:

  • 感谢您的帮助!它确实有效,但比以前慢了近 150 倍。你知道如何让它更快吗?
  • 对不起,我没有!它就是这样,但只是为了它,我会尝试单独的解码和编码语句,看看它是否有所作为。另一种选择是让 csv 文件的创建者以 utf-8 格式创建它,从而为您省去烦恼。
【解决方案2】:

来自Python CSV docs

csv 模块不直接支持读写 Unicode, 但对于 ASCII NUL 的一些问题,它是 8 位干净的 人物。所以你可以编写函数或类来处理 只要您避免像这样的编码,就可以为您编码和解码 使用 NUL 的 UTF-16。推荐使用 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],
                )

【讨论】:

  • 我得到“UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 462: ordinal not in range(128)”
【解决方案3】:

试试这个:

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]),
                )

【讨论】:

  • 我得到:“UnicodeDecodeError:'ascii'编解码器无法解码位置 5 的字节 0xcc:序数不在范围内(128)”
猜你喜欢
  • 2011-04-06
  • 2016-05-05
  • 1970-01-01
  • 2012-11-02
  • 2012-09-10
  • 1970-01-01
  • 2021-11-09
  • 2010-11-18
  • 1970-01-01
相关资源
最近更新 更多