python - 摆脱 unicode 十进制字符
问题描述
我有一个巨大的文件,看起来像这样:
6814;gymnocéphale;185;151;49
6815;gymnodonte;83;330;0
6816;gymnosome;287;105;42
6817;hà mã;69;305;0
6818;hải âu;81;294;0
6819;hải cẩu;64;338;0
6820;hải yến;62;269;0
6848;histiophore;57;262;0
6849;hiverneur;56;248;0
6850;hổmang;54;298;0
6851;holobranche;97;329;0
6852;hoplopode;65;296;0
6853;hươu cao cổ152;298;0
6854;huyền đề62;324;0
6855;hyalosome;73;371;0
6883;jumarre;83;295;0
6884;kéc;86;326;0
6885;kền kền;73;303;0
6886;khoang;64;323;0
6887;khướu;62;325;0
如您所见,该文件包含一些 unicode 十进制,我想在使用该文件之前将它们全部替换为拉丁字符。即使使用 utf-8 编码打开它,也不会抑制错误。
你知道一种方法吗?我想创建一个字典并检索索引 2 处的数字。
for : 6883;jumarre;83;295;0; => i have 83
for : 6887;khướu;62;325;0 => i have ớ => which is false , i should have 62
with codecs.open('JeuxdeMotsPolarise_test.txt', 'r', 'utf-8', errors = 'ignore') as text_file:
text_file =(text_file.read())
#print(text_file)
dico_lexique = ({i.split(";")[1]:i.split(";")[2:]for i in text_file.split("\n") if i})
这是尝试@serge 命题时给出的结果,但它在行之间留下了空格。
6814;gymnocéphale;185;151;49
6815;gymnodonte;83;330;0
6816;gymnosome;287;105;42
6817;hà mã;69;305;0
6818;hi âu;81;294;0
6819;hi cu;64;338;0
6820;hi yn;62;269;0
6848;histiophore;57;262;0
6849;hiverneur;56;248;0
6850;h mang;54;298;0
6851;holobranche;97;329;0
6852;hoplopode;65;296;0
6853;hu cao c;152;298;0
6854;huyn ;62;324;0
6855;hyalosome;73;371;0
6883;jumarre;83;295;0
6884;kéc;86;326;0
6885;kn kn;73;303;0
6886;khoang;64;323;0
6887;khu;62;325;0
编辑:我重新下载原始文件和缺少“;”的错误 已更正。
例如:
=> 6850;hổ mang;54;298;0 (这就是现在更新文件中出现的方式)
谢谢大家
解决方案
@PanagiotisKanavos 已经正确猜到html.unescape
能够用其 unicode 字符替换 xml char 引用。困难的部分是一些 refs 以它们的终止分号 ( ;
) 正确结束,而另一些则不是。在后一种情况下,如果一个实体后跟分号分隔符,则分隔符将被转换吃掉,从而移动以下字段。
所以唯一可靠的方法是:
- 将文件逐行处理为带有
;
分隔符的 CSV 文件 - 最终从第二个到第四个开始从结尾连接中间场
- 逃离那个中间领域
如果要转换文件,可以执行以下操作:
with open('file.csv') as fd, open('fixed.csv', 'w', newline='') as fdout:
rd = csv.reader(fd, delimiter=';')
wr = csv.writer(fdout, delimiter=';')
for row in rd:
if len(row)> 5:
row[1] = ';'.join(row[1:len(row)-3])
del row[2:len(row)-3]
row[1] = html.unescape(row[1])
wr.writerow(row)
如果您只想构建从字段 0 到字段 2 的映射:
values = {}
with open('file.csv') as fd:
rd = csv.reader(fd, delimiter=';')
for row in rd:
values[field[0]] = field[-3]
推荐阅读
- c# - .NET CORE Web API 帖子为空
- ios - Siri INPlayMediaIntent 不能用英语以外的任何东西
- jquery - 在许多 setInterval 之后,Chrome for android 滞后
- c# - 如何统一更改文本不透明度?
- google-cloud-platform - Dialogflow 将语音响应设置为默认自动响应
- recaptcha - Google reCaptcha 版本 2 显示图像不一致
- android - 如何在 Visual Studio 中预览可绘制的 xml?
- python - Python 复杂列表 - 理解
- electron - 如何在电子的主进程或渲染器进程中使用键盘 cmd + c/ctrl + c 的快捷方式复制剪贴板内容/数据
- java - 是否应该在每个集合上实例化 Prometheus Java simpleclient Custom Collector 指标?