Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django w/sqlite3 CharField在特殊字符上崩溃:“;Rü;佩尔';“s秃鹫”;_Python_Django_Csv_Unicode_Sqlite - Fatal编程技术网

Python Django w/sqlite3 CharField在特殊字符上崩溃:“;Rü;佩尔';“s秃鹫”;

Python Django w/sqlite3 CharField在特殊字符上崩溃:“;Rü;佩尔';“s秃鹫”;,python,django,csv,unicode,sqlite,Python,Django,Csv,Unicode,Sqlite,Django版本1.9,数据库后端:sqlite3 我很难想出如何处理这个错误。我正在将主鸟类物种列表()导入到一组Django模型中。我的导入进行得很顺利,但是当我试图保存这个值时,它崩溃了:Rüppell's秃鹫。目标字段的定义如下: species_english = models.CharField(max_length=100, default=None, blank=True, null=True) 这里有一个错误: 编程错误:除非使用 可以解释8位ByTestRing的文本工厂(

Django版本1.9,数据库后端:sqlite3

我很难想出如何处理这个错误。我正在将主鸟类物种列表()导入到一组Django模型中。我的导入进行得很顺利,但是当我试图保存这个值时,它崩溃了:
Rüppell's秃鹫
。目标字段的定义如下:

species_english = models.CharField(max_length=100, default=None, blank=True, null=True)
这里有一个错误:

编程错误:除非使用 可以解释8位ByTestRing的文本工厂(如文本工厂= str)。强烈建议您只需切换 Unicode字符串的应用程序

我正在通读unicode字符串。一开始就很美,就像这样:

species_english = models.CharField(max_length=100, default=None, blank=True, null=True)
Django本机在任何地方都支持Unicode数据。提供您的 数据库可以以某种方式存储数据,您可以安全地传递数据 模板、模型和数据库的Unicode字符串

同时查找这个字符:
ü
,它的表示形式是unicode和utf-8

将此字符串保存到DB的方法非常简单,我只是使用
CSV.reader
解析CSV文件:

new_species = Species(genus=new_genus, species=row[4], species_english=row[7])
其中错误抛出字符串包含在
行[7]
中。为什么数据库不允许此字符,我遗漏了什么

更新

以下是导入数据的整个脚本的内容:

import csv
from birds.models import SpeciesFile, Order, Family, Genus, Species, Subspecies

csv_file = str(SpeciesFile.objects.all()[0].species_list)

#COLUMNS
#0 - Order
#1 - Family Scientific
#2 - Family (English)
#3 - Genus
#4 - Species
#5 - SubSpecies


with open("birds/media/"+csv_file.split('/')[1], 'rU') as c:
    Order.objects.all().delete()
    Family.objects.all().delete()
    Genus.objects.all().delete()
    Species.objects.all().delete()
    Subspecies.objects.all().delete()
    reader = csv.reader(c, delimiter=';', quotechar='"')
    ini_rows = 4
    for row in reader:
        if ini_rows > 0:
            ini_rows -= 1
            continue
        if row[0]:
            new_order = Order(order=row[0])
            new_order.save()
        elif row[1]:
            new_fam = Family(order = new_order, family_scientific=row[1], family_english=row[2])
            new_fam.save()
        elif row[3]:
            new_genus = Genus(family = new_fam, genus=row[3])
            new_genus.save()
        elif row[4]:
            print row[4]
            new_species = Species(genus=new_genus, species=row[4], species_english=row[7])
            new_species.save()
        elif row[5]:
            print row[5]
            new_subspecies = Subspecies(species=new_species, subspecies=row[5])
            new_subspecies.save()
下面是models.py文件定义:

from __future__ import unicode_literals

from django.db import models

class SpeciesFile(models.Model):
    species_list = models.FileField()

class Order(models.Model):
    order = models.CharField(max_length=100)

    def __str__(self):
        return self.order

class Family(models.Model):
    order = models.ForeignKey(Order)
    family_scientific = models.CharField(max_length=100)
    family_english = models.CharField(max_length=100)

    def __str__(self):
        return self.family_english+" "+self.family_scientific

class Genus(models.Model):
    family = models.ForeignKey(Family)
    genus = models.CharField(max_length=100)

    def __str__(self):
        return self.genus

class Species(models.Model):
    genus = models.ForeignKey(Genus, default=None)
    species = models.CharField(max_length=100, default=None)
    species_english = models.CharField(max_length=100, default=None, blank=True, null=True)

    def __str__(self):
        return self.species+" "+self.species_english

class Subspecies(models.Model):
    species = models.ForeignKey(Species)
    subspecies = models.CharField(max_length=100)

    def __str__(self):
        return self.subspecies

Django CharField是一种面向字符的格式。您需要传递Unicode字符串

CSV是一种面向字节的格式。从CSV文件中读取数据时,会得到字节字符串

要从字节到字符,您必须知道在导出CSV文件时将原始字符转换为字节时使用的编码。理想情况下,这将是UTF-8,但如果文件来自Excel,则可能不会。可能是Windows-1252(“西欧安装的ANSI”代码页)。也许是别的原因

(Django/Python 2允许您在只有ASCII字节(字节0-127)的情况下将字节字符串写入Unicode属性,因为这些字节在许多编码中都有相同的映射。ASCII是实现我的意思的“最佳猜测”,但它不可靠,Python 3更喜欢在尝试时出错。)

因此:

或者,一次解码整行:

row = [s.decode('windows-1252') for s in row]

Django CharField是一种面向字符的格式。您需要传递Unicode字符串

CSV是一种面向字节的格式。从CSV文件中读取数据时,会得到字节字符串

要从字节到字符,您必须知道在导出CSV文件时将原始字符转换为字节时使用的编码。理想情况下,这将是UTF-8,但如果文件来自Excel,则可能不会。可能是Windows-1252(“西欧安装的ANSI”代码页)。也许是别的原因

(Django/Python 2允许您在只有ASCII字节(字节0-127)的情况下将字节字符串写入Unicode属性,因为这些字节在许多编码中都有相同的映射。ASCII是实现我的意思的“最佳猜测”,但它不可靠,Python 3更喜欢在尝试时出错。)

因此:

或者,一次解码整行:

row = [s.decode('windows-1252') for s in row]

请显示该代码的上下文,包括读取CSV的部分。@DanielRoseman-谢谢,我包括了导入脚本和models.py内容。@DanielRoseman 2.7请显示该代码的上下文,包括读取CSV的部分。@DanielRoseman-谢谢,我包括了导入脚本和models.py内容。@DanielRoseman 2.7您的
windows-1252
编码不起作用,但关于编码问题,您当然是对的。我最终用谷歌文档打开了xls文件,然后从那里下载了一个csv。它处理新文件时没有指定编码。我的Mac电脑上有中文版的excel,所以它一定是某种奇怪的编码。你的
windows-1252
编码不起作用,但你在编码问题上是对的。我最终用谷歌文档打开了xls文件,然后从那里下载了一个csv。它处理新文件时没有指定编码。我的Mac电脑上有中文版的excel,所以它一定是某种奇怪的编码。