Encode wrong formated emojis in python - python

EDIT
I've a text file containing sentences including emojis that I cannot handle correctly.
My csv file contains those sentences :
Je suis sur que certaines personnes vont faire la file pour toucher cette borne unicode-d83d\ude02
Aurelie Gouverneur voir même la lechée peut être unicode-d83d\ude02unicode-d83d\ude02unicode-d83e\udd2e
Mélanie Ham même ce prendre en photo avec unicode-d83e\udd23
My code :
df_test=pd.read_csv("myfile.csv", sep=';',index_col=None, encoding="utf-8")
for item, row in df_test.iterrows():
print(repr(row["Message"]))
s=row["Message"]
s = re.sub(r'unicode-([0-9a-f]{4})',lambda m: chr(int(m.group(1),16)),s)
s = s.encode('utf16','surrogatepass').decode('utf16')
The printed results :
'Je suis sur que certaines personnes vont faire la file pour toucher cette borne unicode-d83d\\ude02'
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-40-e3c423a15acd> in <module>
5 s=row["Message"]
6 s = re.sub(r'unicode-([0-9a-f]{4})',lambda m: chr(int(m.group(1),16)),s)
----> 7 s = s.encode('utf16','surrogatepass').decode('utf16')
UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 162-163: illegal UTF-16 surrogate
The issue is probably related to the encoding when I load the csv into a dataframe, but I've no idea how to solve this...

The text is a combination of a Unicode escape and a custom syntax. This will decode as described by capturing the hexadecimal values of the two escape codes, then formatting them into a JSON-formatted pair of surrogates and letting that module convert to the correct Unicode code point.
#coding:utf8
import re
import json
sentences = [r'Je suis sur que certaines personnes vont faire la file pour toucher cette borne unicode-d83d\ude02',
r'Aurelie Gouverneur voir même la lechée peut être unicode-d83d\ude02unicode-d83d\ude02unicode-d83e\udd2e',
r'Mélanie Ham même ce prendre en photo avec unicode-d83e\udd23']
def surrogates_to_unicode(m):
upper = int(m.group(1),16)
lower = int(m.group(2),16)
return json.loads(f'"\\u{upper:04x}\\u{lower:04x}"')
for s in sentences:
s = re.sub(r'unicode-([0-9a-f]{4})\\u([0-9a-f]{4})',surrogates_to_unicode,s)
print(s)
Je suis sur que certaines personnes vont faire la file pour toucher cette borne 😂
Aurelie Gouverneur voir même la lechée peut être 😂😂🤮
Mélanie Ham même ce prendre en photo avec 🤣

Related

Count occurrences of words in a text with special characters

I want to count occurrences of each word in a text to spot the key words coming over the most.
This script works quite well but the problem is that this text is written in French. So there are important key words that would be missed.
For example the word Europe may appear in the text like l'Europe or en Europe.
In the first case, the code will remove the apostrophe and l'Europe is considered as one unique word leurope in the final result.
How can I improve the code to split l' from Europe?
import string
# Open the file in read mode
#text = open("debat.txt", "r")
text = ["Monsieur Mitterrand, vous avez parlé une minute et demie de moins que Monsieur Chirac dans cette première partie. Je préfère ne pas avoir parlé une minute et demie de plus pour dire des choses aussi irréelles et aussi injustes que celles qui viennent d'être énoncées. Si vous êtes d'accord, nous arrêtons cette première partie, nous arrêtons les chronomètres et nous repartons maintenant pour une seconde partie en parlant de l'Europe. Pour les téléspectateurs, M. Mitterrand a parlé 18 minutes 36 et M. Chirac, 19 minutes 56. Ce n'est pas un drame !... On vous a, messieurs, probablement jamais vus plus proches à la fois physiquement et peut-être politiquement que sur les affaires européennes... les Français vous ont vus, en effet, à la télévision, participer ensemble à des négociations, au coude à coude... voilà, au moins, un domaine dans lequel, sans aucun doute, vous connaissez fort bien, l'un et l'autre, les opinions de l'un et de l'autre. Nous avons envie de vous demander ce qui, aujourd'hui, au -plan européen, vous sépare et vous rapproche ?... et aussi lequel de vous deux a le plus évolué au cours des quelques années qui viennent de s'écouler ?... #"]
# Create an empty dictionary
d = dict()
# Loop through each line of the file
for line in text:
# Remove the leading spaces and newline character
line = line.strip()
# Convert the characters in line to
# lowercase to avoid case mismatch
line = line.lower()
# Remove the punctuation marks from the line
line = line.translate(line.maketrans("", "", string.punctuation))
# Split the line into words
words = line.split(" ")
# Iterate over each word in line
for word in words:
# Check if the word is already in dictionary
if word in d:
# Increment count of word by 1
d[word] = d[word] + 1
else:
# Add the word to dictionary with count 1
d[word] = 1
sorted_tuples = sorted(d.items(), key=lambda item: item[1], reverse=True)
sorted_dict = {k: v for k, v in sorted_tuples}
# Print the contents of dictionary
for key in list(sorted_dict.keys()):
print(key, ":", sorted_dict[key])
line = line.translate(line.maketrans("", "", string.punctuation))
removes all punctuation characters (l'Europe becomes lEurope). Instead of that, you may want to replace them by spaces, using for example:
for p in string.punctuation:
line = line.replace(p, ' ')
Where you currently have:
line = line.translate(line.maketrans("", "", string.punctuation))
... you can add the following line before it:
line = line.translate(line.maketrans("'", " "))
This will replace the ' character with a space wherever it's found, and the line using string.punctuation will behave exactly as before, except that it will not encounter any ' characters since we have already replaced them.

How to replace " \\u0027 " by " ' " in python?

i am new to python, and im trying to program a scraper.
firstly, i extract this kind of string in a variable (lets call it data[1], because it's contained in an array):
\"description\":\"Alors qu\\u0027ils montaient dans l\\u0027un des
couloirs du versant nord du Hohneck (\\"le premier couloir \u00E0
droite\\"), deux alpinistes ont d\u00E9clench\u00E9 une plaque et ont
\u00E9t\u00E9 emport\u00E9s tous les deux. L\\u0027un sera enseveli et
l\\u0027autre ne pourra d\u00E9clencher l\\u0027alerte qu\\u0027\u00E0
la nuit. La victime ne sera retrouv\u00E9e que d\u00E9but avril.
\u003cbr\u003e Sur la photo prise en f\u00E9vrier 2011, le
trac\u00E9 approximatif de l\\u0027avalanche a \u00E9t\u00E9
repr\u00E9sent\u00E9.\",
then, i use :
data = data[1].encode().decode('unicode-escape')
but it gives me :
"description":"Alors qu\u0027ils montaient dans l\u0027un des couloirs
du versant nord du Hohneck (\"le premier couloir à droite\"), deux
alpinistes ont déclenché une plaque et ont été emportés tous les deux.
L\u0027un sera enseveli et l\u0027autre ne pourra déclencher
l\u0027alerte qu\u0027à la nuit. La victime ne sera retrouvée que
début avril. \u003cbr\u003e Sur la photo prise en février 2011, le
tracé approximatif de l\u0027avalanche a été représenté.",
indeed, char with accent had been replaced but apostrophes stay unprocessed !
It seems the two backslashes are the cause.
i tried several methods :
like decode twice and then "\u0027" become "'", but "é" become "é".
data.replace('é', 'é') or data.replace(u'\u0027', u'é') dont work
So, do you have any idea how i could fix this probleme ?
Problem fixed !
As user2357112 supports Monica said, i tried to process manually a json.
But doing :
data = html_page.find_all("script")
data = re.findall("(?<=JSON\.parse\(')[A-Za-z0-9'.?!/+=;:,()\\\ \"\-{_àâçéèêëíìîôùûæœÁÀÂÃÇÉÈÊËÍÌÎÔÙÛ©´<>]*", str(data))
data = data[0].encode().decode('unicode-escape') + "\"\"}"
data_dict = json.loads(data)
string_data_dict = json.dumps(data_dict)
for cle, val in data_dict.items() :
print(cle + " : " + str(val))
solves the bug.
With this code, an input string like :
<script>
var admin = false;
var avalanche = JSON.parse('{...\"description\":\"Alors qu\\u0027ils montaient dans l\\u0027un des couloirs du versant nord du Hohneck (\\\"le premier couloir \u00E0 droite\\\"), deux alpinistes ont d\u00E9clench\u00E9 une plaque et ont \u00E9t\u00E9 emport\u00E9s tous les deux. L\\u0027un sera enseveli et l\\u0027autre ne pourra d\u00E9clencher l\\u0027alerte qu\\u0027\u00E0 la nuit. La victime ne sera retrouv\u00E9e que d\u00E9but avril. \\u003cbr\\u003e Sur la photo prise en f\u00E9vrier 2011, le trac\u00E9 approximatif de l\\u0027avalanche a \u00E9t\u00E9 repr\u00E9sent\u00E9.\",...
gives an output like :
...
description : Alors qu'ils montaient dans l'un des couloirs du versant nord du Hohneck ("le premier couloir à droite"), deux alpinistes ont déclenché une plaque et ont été emportés tous les deux. L'un sera enseveli et l'autre ne pourra déclencher l'alerte qu'à la nuit. La victime ne sera retrouvée que début avril. <br> Sur la photo prise en février 2011, le tracé approximatif de l'avalanche a été représenté.
...
Thanks you.

python delete images in string only obtain letters and numbers

I wrote a python program to obtain a string, and found there are images in some string, for example: 👉😢👈, or "Siempre en día de la Madre la pasábamos así todos en familia dando mucho cariño a nuestra preciosa madre pero hoy la vamos a pasar solos extrañando a mamá👩 pero siempre llevándola en nuestros corazones❤".
I want to delete theses images from the strings, obtaining only numbers and letters.
And please notice: these string are not only written in English, they may be written in all kinds of languages (for example: Arabic, or Japanese).
My program:
for post_item in group_member_posts_list:
if post_item['post_content']:
post_item_content_str = post_item['post_content']
print("post_item_content_str:" + post_item_content_str)
post_item_content_str = filter(str.isalnum,post_item_content_str)
print("after filter post_item_content_str:" + post_item_content_str )
b = TextBlob(post_item_content_str)
post_item_content_type = b.detect_language()
I tried to use filter function, but it gives errors. And isalnum function can only find English letters.
Could you please tell me how to resolve this problem?
By image, I believe you meant emojis (😀😋👌), you can simply use re.sub to replace them from your string.
import re
emoji_finder = re.compile('[\U0001F300-\U0001F64F\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]+')
tcase_1 = "Siempre en día de la Madre la pasábamos así todos en familia dando mucho cariño a nuestra preciosa madre pero hoy la vamos a pasar solos extrañando a mamá👩 pero siempre llevándola en nuestros corazones❤"
tcase_2 = "bet👉😢👈ween"
print(re.sub(emoji_finder, "", tcase_1))
print(re.sub(emoji_finder, "", tcase_2))
Output:
Siempre en día de la Madre la pasábamos así
todos en familia dando mucho cariño a nuestra
preciosa madre pero hoy la vamos a pasar
solos extrañando a mamá pero siempre
llevándola en nuestros corazones
# and
between
Test it here: https://repl.it/IIWG
Adapted from this post and modified to support python 3.

rare exception in tkinter callback error message

I'm working on a code for a school which tells the students how many times they can skip classes. It doesn't work because there is an specific mistake that is always appearing:
Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/tkinter/__init__.py", line 1533, in __call__
return self.func(*args)
File "/Users.py", line 52, in inicio
for line in improt:
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 25: ordinal not in range(128)
I already tried to import mtTkinter but the program didn't recognize it. The mistake says tkinter is getting the wrong number of args. The line that caused the error was this one:
for line in importar:
lista.append(line)
But that seems like the right number of arguments, so what's going on?
There are also some strange mistakes that keep the program to run well.
Here I put my code so you can see if it works.
from tkinter import*
import math
import tkinter.filedialog
import traceback
import sys
ventana=Tk()
ventana.title("Este programa le dice cuantas veces mas puede faltar de ausencias 1, 2 y 3")
ventana.geometry("1000x1000")
lista=[]
clas=Label(ventana, text="Si tu materia es Tecno, Frances o Edufis, escribela tal cual en el cuadro").place(x=50,y=90)
classe=Entry(ventana)
classe.place(x=50,y=110)
segu=Label(ventana, text="Si tu materia es Español o Actualidad, escribela tal cual en el cuadro").place(x=50,y=140)
segun=Entry(ventana)
segun.place(x=50,y=160)
tercis=Label(ventana, text="Si tu materia es Qui, Math, Ingles o Filosofia, escribela tal cual en el cuadro").place(x=50,y=190)
terce=Entry(ventana)
terce.place(x=50,y=220)
a=Label(ventana, text="¿Cuantas veces ha faltado por ausencias o retardos 1?").place(x=50,y=250)
aa=Entry(ventana)
aa.place(x=50,y=270)
b=Label(ventana, text="¿Cuantas veces ha faltado por ausencias o retardos 2?").place(x=50,y=300)
bb=Entry(ventana)
bb.place(x=50,y=320)
c=Label(ventana, text="¿Cuantas veces ha faltado por ausencias o retardos 3?").place(x=50,y=350)
cc=Entry(ventana)
cc.place(x=50,y=380)
def inicio ():
global lista
global classe
global segu
global tercis
global aa
global bb
global cc
clases=(Entry.get(classe))
materias = filedialog.askopenfilename(filetypes=(("Archivo de texto","*.txt"),("Cualquier archivo","*.*")))
improt = open(materias,"r")
for line in improt:
lista.append(line)
if clases== Tecno:
Tecno= lista(0)
if clases== Frances:
Frances= lista(1)
if clases== Edufis:
Edufis= lista(2)
for i in range (0,2):
total=70
AM= (total*15)/100
A=(Entry.get(aa))
if A<AM:
res= AM-A
print("le quedan ", res, " ausencias o retardos 1")
if A==AM:
print("No puede tener mas ausencias o retardos 1")
if A>AM:
print("Ya se paso del maximo de ausencias o retardos 1")
segunda=(Entry.get(segun))
if segun== Español:
Español= lista(3)
if segun== Actualidad:
Actualidad= lista(4)
for i in range(3,4):
totala=140
BM= (totala*15)/100
B=(Entry.get(bb))
if B<AM:
tes= AM-B
print("le quedan ", tes, " ausencias o retardos 2")
if B==AM:
print("No puede tener mas ausencias o retardos 2")
if B>AM:
print("Ya se paso del maximo de ausencias o retardos 2")
tercera=(Entry.get(terce))
if terce== Qui:
Qui= lista(5)
if terce== Math:
Math= lista(6)
if terce== Ingles:
Ingles= lista(7)
if terce== Filo:
Filo= lista(8)
for i in range (5,8):
totale=175
CM= (totale*15)/100
C=(Entry.get(cc))
if C<BM:
pes= BM-C
print ("le quedan ", pes, " ausencias o retardos 2")
if C==BM:
print ("No puede tener mas ausencias o retardos 2")
if C>BM:
print ("Ya se paso del maximo de ausencias o retardos 2")
improt.close()
escoge = Button(ventana, text = "Escoge un archivo y despues escribe tu materia en el cuadro que corresponda", command = inicio).place(x =45, y = 30)
cierra = Button(ventana, text = "Cierra", command = ventana.destroy).place(x = 50, y = 420)
ventana.mainloop()
It looks like your system default is ASCII
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 25: ordinal not in range(128)
Assuming the language the file is using is Latin-1, try adding
#! /usr/bin/python ## (your shebang may be slightly different)
# -*- coding:latin-1 -*-
## next line after the shebang
## and then
for line.decode('latin-1') in improt:
If you open the file in Firefox and then View > Text Encoding, it should say what the encoding is. There are also websites that will do this. Also, this is a common problem (not a rare exception) so a search for "UnicodeDecodeError: 'ascii' codec can't decode byte" should produce a lot of hits

Global name is not defined executing a function

I'm coding a project, in which I have 2 files (dataStructure.py and calculUser.py) working together and 1 which is a test file.
In structureDonnees.py I have this function which reads a dataset containing cars and builds data structures :
# -*-encoding:utf-8-*-
import csv
import sys #pour utiliser maximum et minimum du type float
from calculUser import *
from trajetUser import *
def recupVoiture() :
#nom de la base de donnée
nomFichier = 'CO2_passenger_cars_v10.csv'
#on ouvre le fichier en lecture
opener = open(nomFichier, "r")
#On ouvre le fichier nomFichier en lecture
lectureFichier = csv.reader(opener, delimiter='\t')
#le dico contenant les carburants
fuelType = dict()
#le dico contenant les voitures
voiture = dict()
#le dico contenant les émissions de CO2 en g/km
emission = dict()
#minimum et maximum emission
min_emission = sys.float_info.max #initialisé à max(float) pour que l'on soit sûr que toutes les emissions soient plus petites
max_emission = sys.float_info.min #initialisé à min(float) pour que l'on soit sûr que toutes les emissions soient plus grandes
for row in lectureFichier :
#Si la colonne existe
if row:
#construction du dictionnaire voiture
if voiture.has_key(row[10]) :
if row[11].upper() not in voiture[row[10]] : voiture[row[10]].append("%s" %row[11].upper()) #on ajoute le modèle
else :
voiture[row[10]] = [] #on crée une liste vide contenant les modèles et leurs versions
voiture[row[10]].append("%s" %row[11]) #on ajoute le modèle et sa version
#construction du dictionnaire fuelType
if fuelType.has_key(row[10]) : fuelType[row[10]].append(row[19].upper()) #ajout du type de carburant utilisé par la voiture correspondante dans voiture{}
else :
fuelType[row[10]] = [] #on crée une liste vide contenant les carburants
fuelType[row[10]].append(row[19]) #ajout du type de carburant utilisé par la voiture correspondante dans voiture{}
#construction du dictionnaire emission
if emission.has_key(row[10]) :
emission[row[10]].append(row[14]) #ajout de la quantité de CO2 émise par la voiture correspondante dans voiture{}
min_emission = minEmission(float(row[14]), min_emission)
max_emission = maxEmission(float(row[14]), max_emission)
else :
emission[row[10]] = [] #on crée une liste vide contenant les émissions en CO2
fuelType[row[10]].append(row[14]) #ajout de la quantité de CO2 émise par la voiture correspondante dans voiture{}
min_emission = minEmission(float(row[14]), min_emission)
max_emission = maxEmission(float(row[14]), max_emission)
#On ferme le fichier
opener.close()
#La valeur de retour est un tableau contenant les structures de données générées.
res = [voiture, fuelType, emission, min_emission, max_emission]
return res
In the calculUser.py, I defined the minEmission and maxEmission function :
def minEmission(emissionFichier, min_emission) :
if emissionFichier < min_emission :
min_emission = emissionFichier
return min_emission
def maxEmission(emissionFichier, max_emission) :
if emissionFichier > max_emission :
max_emission = emissionFichier
return max_emission
When I'm executing test.py, I get an error with this line :
table = recupVoiture()
Traceback (most recent call last):
File "test.py", line 13, in <module>
tableau = recupVoiture()
File "/home/user/Polytech/ge3/ProjetPython/structureDonnees.py", line 60, in recupVoiture
min_emission = minEmission(float(row[14]), min_emission)
NameError: global name 'minEmission' is not defined
I don't understand why I get this error. By executing everything except test.py I get no error but when I do it doesn't execute due to this minEmission and maxEmission not defined.
Is it because I'm calling a function when I'm defining a function?
How could I fix it?
I fixed the problem, it seems like my functions minEmission() and maxEmission() couldn't do a reference to max_emission and min_emission since those variables are declared in structureDonnees.py and not in calculUser.py.
I fixed it by creating an intermediary variable which takes the value of min_emission and max_emission and which is returned, instead of min_emission and max_emission.
Plus, I had to do a : from calculUser import minEmission, maxEmissiondirectly in the recupVoiture() function. I know that's awful but it solved the problem. I'll use it until I find a better, cleaner solution.
Thanks for the help guys, I'll do a better post/code if I have to ask any other help ! :)

Categories