我有一个很大的.csv,我正在尝试导入Django项目的MySQL数据库。我正在使用django.db库来编写原始的sql语句,例如:
LOAD DATA LOCAL INFILE 'file.csv'...
但是,我一直收到以下错误:
django.db.utils.OperationalError: (1300, "Hey! Are you out tonight?")
在为该行点击.csv之后,我意识到错误是由这个字符引起的:虽然我确定在解决这个问题后会有其他角色抛出这个错误。
运行:
$ file --mime file.csv
从终端返回:
$ file.csv: text/html; charset=us-ascii
由于我的db的其余部分是UTF-8,我尝试编写一个python脚本来重新编码它,使用.encode('utf-8', 'ignore')
希望'ignore'会删除任何给它带来麻烦的符号,但是投掷:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 825410: invalid continuation byte
问题是,我实际上并不关心将100%的文件插入到我的数据库中。我宁愿只插入不包含奇怪字符的'安全'行。
理想情况下,我正在寻找一种方法来修改我的LOAD DATA LOCAL INFILE
sql语句,因此它只是跳过插入任何给它带来麻烦的行。这是最佳的,因为我不想花时间预处理数据。
如果这不可行,那么下一个最好的方法是使用Python脚本删除任何麻烦的字符/行,以后每当我更新我的数据库时我都可以从我的django应用程序运行。
如果所有其他方法都失败了,有关如何使用UTF-8友好的任何字符的信息,我可以编写一个shell脚本,这将非常有用。
答案 0 :(得分:2)
对于,MySQL必须在要存储它的列,
CHARACTER SET utf8mb4
和连接上使用LOAD DATA
。
更多Python笔记:http://mysql.rjweb.org/doc.php/charcoll#python
E9
没有意义。 的UTF-8编码的十六进制为
F09F989C
。
角色之间转换的联系是无关紧要的;只有UTF-8可用于表情符号。
答案 1 :(得分:1)
不是100%确定这是否会有所帮助,但这是我尝试的:
由于open()用于打开CSV文件进行读取,因此默认情况下使用系统默认编码将文件解码为unicode(请参阅locale.getpreferredencoding())。要使用不同的编码对文件进行解码,请使用open:
的encoding参数
import csv
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
这是从official docs收集的一个例子。请注意,您可能需要将utf-8
替换为实际的文件编码,正如文档所述。然后,您可以继续使用python将数据推送到DB或使用新编码写入新文件。