我正在编写Python3脚本,以便将大量的CSV文件上传到MySQL数据库。
所有csv文件都应该编码为UTF-8,MySQL中的字符串字段是utf8mb4_unicode_ci类型。
我正在使用,但到目前为止,至少在一个文件上,我得到了一个“错误代码: 1300。无效的utf8字符串”
我已经成功地隔离了问题行,但是我在找出如何以编程方式识别和删除坏字符时遇到了困难。我也不确定坏字符是否带有有效的阿拉伯字符(我认为它们就是这样的),或者阿拉伯字符是否是由于行被破坏而出现的。(我怀疑后者,但真的不知道)。
简而言之,我正试图弄清楚如何编程地将这一行变成可以使用LOAD在MySQL中加载的形式。
我找到了一个堆栈溢出的答案,建议使用
bytes(line, 'utf-8').decode('utf-8', 'ignore')
但这似乎行不通。正如您在下面所看到的,同样的事情也出现在建议的转换中。
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)输出
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我还提供了下面的二进制版本,以防有帮助
with open('./badline.txt', 'rb') as f:
l = f.readline()
print(l)输出
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'我怎样才能去掉坏角色,或者把整个领域都认定为坏角色呢?
注:上述示例中包含的数据是公开的。
发布于 2017-05-26 03:40:07
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作为
re.sub("[^a-zA-Z0-9#!,\"[\u0627-\u064a]]+", " ", str(l)) # [\u0627-\u064a] will include your arabic charactershttps://stackoverflow.com/questions/44191655
复制相似问题