2017-11-13 24 views
5

Tôi đang cố tìm kiếm biểu tượng cảm xúc trong chuỗi python. Vì vậy, tôi có, ví dụ,Cách lấy danh sách ký tự unicode thích hợp trong python

em_test = ['\U0001f680'] 
print(em_test) 
[''] 
test = 'This is a test string ' 
if any(x in test for x in em_test): 
    print ("yes, the emoticon is there") 
else: 
    print ("no, the emoticon is not there") 

yes, the emoticon is there 

và nếu một em_test tìm kiếm trong

'This is a test string '

tôi thực sự có thể tìm thấy nó.

Vì vậy, tôi đã tạo tệp csv với tất cả các biểu tượng cảm xúc mà tôi muốn được định nghĩa bằng unicode của chúng. CSV trông như thế này:

\U0001F600

\U0001F601

\U0001F602

\U0001F923

và khi tôi nhập nó và in nó tôi actullay không nhận được biểu tượng cảm xúc mà chỉ là đại diện văn bản:

['\\U0001F600', 
'\\U0001F601', 
'\\U0001F602', 
'\\U0001F923', 
... 
] 

và vì thế tôi không thể sử dụng để tìm kiếm các biểu tượng cảm xúc trong một chuỗi khác ... Tôi bằng cách nào đó biết rằng dấu gạch chéo ngược \ chỉ đại diện cho một dấu gạch chéo đơn nhưng bằng cách nào đó trình đọc unicode không nhận được nó ... Tôi không biết những gì tôi đang thiếu.

Mọi đề xuất?

+0

bạn có chắc chắn không có bất kỳ nguồn cấp dữ liệu nào không? –

Trả lời

2

Bạn có thể giải mã những chuỗi thoát Unicode với .decode('unicode-escape'). Tuy nhiên, .decode là phương thức bytes, vì vậy nếu các chuỗi đó là văn bản thay vì byte, trước tiên bạn cần phải mã hóa chúng thành byte. Ngoài ra, bạn có thể (có thể) mở tệp CSV của bạn ở chế độ nhị phân để đọc các chuỗi đó dưới dạng bytes thay vì chuỗi văn bản.

Chỉ để cho vui, tôi cũng sẽ sử dụng unicodedata để lấy tên của các biểu tượng cảm xúc đó.

import unicodedata as ud 

emojis = [ 
    '\\U0001F600', 
    '\\U0001F601', 
    '\\U0001F602', 
    '\\U0001F923', 
] 

for u in emojis: 
    s = u.encode('ASCII').decode('unicode-escape') 
    print(u, ud.name(s), s) 

đầu ra

\U0001F600 GRINNING FACE 
\U0001F601 GRINNING FACE WITH SMILING EYES 
\U0001F602 FACE WITH TEARS OF JOY 
\U0001F923 ROLLING ON THE FLOOR LAUGHING 

này cần được nhanh hơn nhiều so với sử dụng ast.literal_eval. Và nếu bạn đọc dữ liệu ở chế độ nhị phân, nó sẽ còn nhanh hơn vì nó tránh bước giải mã ban đầu trong khi đọc tệp, cũng như cho phép bạn loại bỏ cuộc gọi .encode('ASCII').

Bạn có thể làm cho giải mã mạnh mẽ hơn một chút bằng cách sử dụng

u.encode('Latin1').decode('unicode-escape') 

nhưng đó không phải là cần thiết cho dữ liệu biểu tượng cảm xúc của bạn. Và như tôi đã nói trước đó, nó sẽ tốt hơn nếu bạn mở tập tin ở chế độ nhị phân để tránh sự cần thiết phải mã hóa nó.

+0

Điều này thật tuyệt vời và hiệu quả. Tôi chỉ gặp vấn đề với một số biểu tượng cảm xúc cụ thể: '\ U00023EB' -> nhận lỗi của SyntaxError: (lỗi unicode) 'unicodeescape' codec không thể giải mã byte ở vị trí 0-8: cắt ngắn \ UXXXXXXXX thoát – Bullzeye

+0

@Bullzeye Python xem xét ''\ U00023EB'' không hợp lệ: Unicode" Big U "thoát ** ** phải chứa 8 chữ số hex. Chúng ta có thể xử lý điều đó trong mã của mình, nhưng có lẽ tốt hơn là sửa nó trong mã xây dựng CSV. –

+0

Có, chỉ cần tự hỏi nơi sau đó mã sau đây U + 23EB lấy từ trang web đến từ https://unicode.org/emoji/charts/full-emoji-list.html – Bullzeye

1

1. giữ csv của bạn như-là:

đó là một giải pháp cồng kềnh, nhưng sử dụng ast.literal_eval công trình:

import ast 

s = '\\U0001F600' 

x = ast.literal_eval('"{}"'.format(s)) 
print(hex(ord(x))) 
print(x) 

tôi nhận được 0x1f600 (đó là đúng mã char) và một số nhân vật biểu tượng cảm xúc(). (tôi cũng phải sao chép/dán một char lạ từ bàn điều khiển của tôi vào ô văn bản trả lời này nhưng đó là vấn đề giao diện người dùng, nếu không nó sẽ hoạt động)

chỉ cần nhập dấu ngoặc đơn để cho phép nhập.

2. sử dụng mã nhân vật trực tiếp

có lẽ bạn muốn được tốt hơn bằng cách lưu trữ các mã ký tự bản thân thay vì \U định dạng:

print(chr(0x1F600)) 

không giống hệt nhau (vì vậy ast là hơi quá mức)

csv của bạn có thể chứa:

0x1F600 
0x1F601 
0x1F602 
0x1F923 

sau đó chr(int(row[0],16)) sẽ làm các trick khi đọc nó: Ví dụ, nếu một trong 1 dòng trong CSV (hoặc hàng đầu tiên)

with open("codes.csv") as f: 
    cr = csv.reader(f) 
    codes = [int(row[0],16) for row in cr] 
+0

ok - công trình in tuyệt vời! Tôi có thể yêu cầu bạn xây dựng về cách đọc csv - không nhận được phần chr (int (hàng [0], 16)) - cách tích hợp này ví dụ như trong pos_emo_twitter = pandas.read_csv ('list pos emoticons. csv ') – Bullzeye

+0

Tôi không sử dụng gấu trúc. Tôi đang sử dụng csv cơ bản. chỉnh sửa. –

Các vấn đề liên quan