比较两种不同编码中的相同字符串失败

时间:2021-04-26 10:10:47

标签: python json pandas csv encoding

我正在尝试根据我通过调用从 tsv 文件中获取的字符串列表来过滤大型 json 文件

df = pd.read_csv("example.tsv", header = 0, sep = '\t', encoding = 'utf-8')
names = df['name'].tolist()

我确信列表的所有字符串都是 json 键,但是当我进行过滤时,我得到的结果少于名称列表的长度,因为列表的名称和json 对象似乎具有不同的编码 (?)。

例如在我用python打印出来的列表中

l = ['Boro StjepanoviÃÂ']

和python打印出来的json文件中的等价物

{'Boro Stjepanović': ['Boro Stjepanović', 'Borislav Stjepanović', 'Боро Стјепановић', 'بورو ستجيبانوفيك', 'Bosnian', 'Herzegovinian', 'actor', 'Borislav Boro Stjepanović', 'Boro Stjepanovic', 'Борислав Стјепановић', 'Bora Stjepanović', 'Boro Stjepanović', 'male', 'Sterija Award for Achievement in Acting', 'human', 'Vareš']}]

我如何确保这两个匹配?

编辑:hexdump -C example.tsv 的部分输出

00000000  6e 61 6d 65 09 73 75 6d  6d 61 72 79 09 77 69 6b  |name.summary.wik|
00000010  69 70 65 64 69 61 0d 0a  62 6f 72 6f 20 73 74 6a  |ipedia..boro stj|
00000020  65 70 61 6e 6f 76 69 c3  83 c2 84 c3 82 c2 87 09  |epanovi.........|
00000030  22 42 6f 72 69 73 6c 61  76 20 22 22 42 6f 72 6f  |"Borislav ""Boro|
00000040  22 22 20 53 74 6a 65 70  61 6e 6f 76 69 c3 83 c2  |"" Stjepanovi...|
00000050  84 c3 82 c2 87 20 28 62  6f 72 6e 20 38 20 4d 61  |..... (born 8 Ma|
00000060  79 20 31 39 34 36 20 69  6e 20 56 61 72 65 c3 83  |y 1946 in Vare..|
00000070  c2 85 c3 82 c2 a1 2c 20  53 52 20 42 6f 73 6e 69  |......, SR Bosni|
00000080  61 20 61 6e 64 20 48 65  72 7a 65 67 6f 76 69 6e  |a and Herzegovin|
00000090  61 2c 20 53 46 52 20 59  75 67 6f 73 6c 61 76 69  |a, SFR Yugoslavi|
000000a0  61 29 20 69 73 20 61 20  42 6f 73 6e 69 61 6e 20  |a) is a Bosnian |

1 个答案:

答案 0 :(得分:1)

好吧,您的输入似乎是“双重过度编码”,即有人错误地将 UTF-8 数据编码为 UTF-8...两次;(

你可以在 python 中清理它:

with open('example.tsv', 'rb') as fp:
    data = fp.read()

data = data.decode('utf8').encode('latin1').decode('utf8').encode('latin1').decode('utf8')

或使用 iconv 两次:

iconv -t iso-8859-1 -f utf-8 example.tsv > temp1
iconv -t iso-8859-1 -f utf-8 temp1 > example.tsv