Python Django w/sqlite3 CharField在特殊字符上崩溃:“;Rü;佩尔';“s秃鹫”;
Django版本1.9,数据库后端:sqlite3 我很难想出如何处理这个错误。我正在将主鸟类物种列表()导入到一组Django模型中。我的导入进行得很顺利,但是当我试图保存这个值时,它崩溃了: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的文本工厂(
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,所以它一定是某种奇怪的编码。