首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在加载到MySQL之前,使用Python3从文件中删除无效的UTF-8字符

在加载到MySQL之前,使用Python3从文件中删除无效的UTF-8字符
EN

Stack Overflow用户
提问于 2017-05-26 00:18:46
回答 1查看 501关注 0票数 2

我正在编写Python3脚本,以便将大量的CSV文件上传到MySQL数据库。

所有csv文件都应该编码为UTF-8,MySQL中的字符串字段是utf8mb4_unicode_ci类型。

我正在使用,但到目前为止,至少在一个文件上,我得到了一个“错误代码: 1300。无效的utf8字符串”

我已经成功地隔离了问题行,但是我在找出如何以编程方式识别和删除坏字符时遇到了困难。我也不确定坏字符是否带有有效的阿拉伯字符(我认为它们就是这样的),或者阿拉伯字符是否是由于行被破坏而出现的。(我怀疑后者,但真的不知道)。

简而言之,我正试图弄清楚如何编程地将这一行变成可以使用LOAD在MySQL中加载的形式。

我找到了一个堆栈溢出的答案,建议使用

bytes(line, 'utf-8').decode('utf-8', 'ignore')

但这似乎行不通。正如您在下面所看到的,同样的事情也出现在建议的转换中。

代码语言:javascript
复制
with open('./badline.txt', 'r', encoding='utf-8') as f:
    line = f.readline()
    print(line)
    line2 = bytes(l, 'utf-8').decode('utf-8', 'ignore')
    print(line2)
    print(line==line2)

输出

代码语言:javascript
复制
50172961,"THERAVANCE INC","901 جينوا ب ينوا بوليفار س ينوا باوث فرنسوليفار س ينوا بوليفار سيسكو كالاوث فرنس ينوا بوليفار سيفورنيا 94064A;سكو كالاوث فرنس ينوا بليفار سيفورنيا 94064A;سكو كالاوث فرنسليفار سيفورنيا 94064A;سكو كالاوث فرنسفورنيا 94064A;سكو كالاوث فرنسفورنيا 94064A;سكو كالفورنيا 94080","US","",9,33431,"THERAVANCE INC",27623584,"THERAVANCE",1,"COMPANY",3531336,"THERAVANCE INC",2

50172961,"THERAVANCE INC","901 جينوا ب ينوا بوليفار س ينوا باوث فرنسوليفار س ينوا بوليفار سيسكو كالاوث فرنس ينوا بوليفار سيفورنيا 94064A;سكو كالاوث فرنس ينوا بليفار سيفورنيا 94064A;سكو كالاوث فرنسليفار سيفورنيا 94064A;سكو كالاوث فرنسفورنيا 94064A;سكو كالاوث فرنسفورنيا 94064A;سكو كالفورنيا 94080","US","",9,33431,"THERAVANCE INC",27623584,"THERAVANCE",1,"COMPANY",3531336,"THERAVANCE INC",2

True

我还提供了下面的二进制版本,以防有帮助

代码语言:javascript
复制
with open('./badline.txt', 'rb') as f:
    l = f.readline()
    print(l)

输出

代码语言:javascript
复制
b'50172961,"THERAVANCE INC","901 \xd8\xac\xd9\x8a\xd9\x86\xd9\x88\xd8\xa7 \xd8\xa8 \xd9\x8a\xd9\x86\xd9\x88\xd8\xa7 \xd8\xa8\xd9\x88\xd9\x84\xd9\x8a\xd9\x81\xd8\xa7\xd8\xb1 \xd8\xb3 \xd9\x8a\xd9\x86\xd9\x88\xd8\xa7 \xd8\xa8\xd8\xa7\xd9\x88\xd8\xab \xd9\x81\xd8\xb1\xd9\x86\xd8\xb3\xd9\x88\xd9\x84\xd9\x8a\xd9\x81\xd8\xa7\xd8\xb1 \xd8\xb3 \xd9\x8a\xd9\x86\xd9\x88\xd8\xa7 \xd8\xa8\xd9\x88\xd9\x84\xd9\x8a\xd9\x81\xd8\xa7\xd8\xb1 \xd8\xb3\xd9\x8a\xd8\xb3\xd9\x83\xd9\x88 \xd9\x83\xd8\xa7\xd9\x84\xd8\xa7\xd9\x88\xd8\xab \xd9\x81\xd8\xb1\xd9\x86\xd8\xb3 \xd9\x8a\xd9\x86\xd9\x88\xd8\xa7 \xd8\xa8\xd9\x88\xd9\x84\xd9\x8a\xd9\x81\xd8\xa7\xd8\xb1 \xd8\xb3\xd9\x8a\xd9\x81\xd9\x88\xd8\xb1\xd9\x86\xd9\x8a\xd8\xa7 94064A;\xd8\xb3\xd9\x83\xd9\x88 \xd9\x83\xd8\xa7\xd9\x84\xd8\xa7\xd9\x88\xd8\xab \xd9\x81\xd8\xb1\xd9\x86\xd8\xb3 \xd9\x8a\xd9\x86\xd9\x88\xd8\xa7 \xd8\xa8\xf2\x80\x99\x88\xd9\x84\xd9\x8a\xd9\x81\xd8\xa7\xd8\xb1 \xd8\xb3\xd9\x8a\xd9\x81\xd9\x88\xd8\xb1\xd9\x86\xd9\x8a\xd8\xa7 94064A;\xd8\xb3\xd9\x83\xd9\x88 \xd9\x83\xd8\xa7\xd9\x84\xd8\xa7\xd9\x88\xd8\xab \xd9\x81\xd8\xb1\xd9\x86\xd8\xb3\xf2\x80\x99\x88\xd9\x84\xd9\x8a\xd9\x81\xd8\xa7\xd8\xb1 \xd8\xb3\xd9\x8a\xd9\x81\xd9\x88\xd8\xb1\xd9\x86\xd9\x8a\xd8\xa7 94064A;\xd8\xb3\xd9\x83\xd9\x88 \xd9\x83\xd8\xa7\xd9\x84\xd8\xa7\xd9\x88\xd8\xab \xd9\x81\xd8\xb1\xd9\x86\xd8\xb3\xf2\x80\x99\x8a\xd9\x81\xd9\x88\xd8\xb1\xd9\x86\xd9\x8a\xd8\xa7 94064A;\xd8\xb3\xd9\x83\xd9\x88 \xd9\x83\xd8\xa7\xd9\x84\xd8\xa7\xd9\x88\xd8\xab \xd9\x81\xd8\xb1\xd9\x86\xd8\xb3\xf2\x80\x99\x8a\xd9\x81\xd9\x88\xd8\xb1\xd9\x86\xd9\x8a\xd8\xa7 94064A;\xd8\xb3\xd9\x83\xd9\x88 \xd9\x83\xd8\xa7\xd9\x84\xf2\x80\x99\x8a\xd9\x81\xd9\x88\xd8\xb1\xd9\x86\xd9\x8a\xd8\xa7 94080","US","",9,33431,"THERAVANCE INC",27623584,"THERAVANCE",1,"COMPANY",3531336,"THERAVANCE INC",2\r\n'

我怎样才能去掉坏角色,或者把整个领域都认定为坏角色呢?

注:上述示例中包含的数据是公开的。

EN

回答 1

Stack Overflow用户

发布于 2017-05-26 03:40:07

代码语言:javascript
复制
import re
with open(path_to_file, 'r', encoding='utf-8') as f:
    l = f.readline()
    print(l)
    new_l = re.sub("[^a-zA-Z0-9#!,\"]+", " ", str(l))  # if you want to eleiminate arabic characters and all other characters which are not in regex
    print(new_l)

但是阿拉伯字符是一种语言,所以我认为如果可以的话,应该使用自己的代码或替换regex作为

代码语言:javascript
复制
re.sub("[^a-zA-Z0-9#!,\"[\u0627-\u064a]]+", " ", str(l))  # [\u0627-\u064a] will include your arabic characters
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44191655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档