O'qilgan unikod belgilarini matndagi boshqalarga almashtirish mumkin emas

Men ingliz alifbosida ko'rinmaydigan maxsus ispancha belgilarni o'rniga Python3da parsherni yaratishga harakat qilaman. Buni amalga oshirish uchun men barcha transformatsiyalarga ega bo'lgan csv matnli faylga ega bo'ldim (utf-8da kodlangan):

\ u00c1, \ u0041

\ u00c9, \ u0045

...

\ u00fc, \ u0075

Ammo men ajralib chiqqanimda hech narsa qilmaydi. Boshqa tomondan, agar buni qilsam yaxshi ishlaydi:

text.replace('\u00c1', '\u0041')

Kodi:

#!/usr/bin/env python3

from csv import reader

class Parser():

    def __init__(self, lang):
        self.lang = lang

    def replace(self, text):
        with open('./data/{}/replace.csv'.format(self.lang), 'r') as file:
            csvreader = reader(file)
            for l in csvreader:
                # text = text.replace('\u00f1','\u006e') This works
                text = text.replace(l[0],l[1])
        return text

def main():
    myparser = Parser('spanish')
    with open('/home/marco/Escritorio/ejemplo.txt', 'r') as file:
        text = file.read()
        print(myparser.replace(text))

if __name__ == '__main__':
    main()
0
Vazifalarni nima uchun o'chirib tashlash kerak? año = yil va ano = anus. Python 3 Unicode'yi juda yaxshi ishlashi mumkin.
qo'shib qo'ydi muallif Mark Tolonen, manba

6 javoblar

CSV faylini ikkilik rejimda oching va keyin har bir qatorni "eskirgan unikode" dan, masalan, '\\ u00c1' , unicode (Python 3 da str kodini kiriting) oldin CSV o'quvchi ma'lumotlarga qo'lini oladi:

def replace(self, text):
    with open('./data/{}/replace.csv'.format(self.lang), 'rb') as f:
        csvreader = reader(line.decode('unicode_escape') for line in f)
        for l in csvreader:
            text = text.replace(l[0], l[1])
    return text

str.decode ('unicode_escape') dan foydalanib, kelgan ma'lumotni qochilgan unikoddan unikod kodlashda kodlashadi. Dekodlash xotira samarali bo'ladi, chunki u butun CSVni xotiraga o'qishdan saqlaydigan bir generatordan foydalanadi. Bir marta bajarilganda CSV moduli ma'lumotlarni unikod sifatida ko'rib chiqadi va mag'lubiyatni almashtirish kutilgandek ishlaydi.

1
qo'shib qo'ydi

CSV faylini ikkilik rejimda oching va keyin har bir qatorni "eskirgan unikode" dan, masalan, '\\ u00c1' , unicode (Python 3 da str kodini kiriting) oldin CSV o'quvchi ma'lumotlarga qo'lini oladi:

def replace(self, text):
    with open('./data/{}/replace.csv'.format(self.lang), 'rb') as f:
        csvreader = reader(line.decode('unicode_escape') for line in f)
        for l in csvreader:
            text = text.replace(l[0], l[1])
    return text

str.decode ('unicode_escape') dan foydalanib, kelgan ma'lumotni qochilgan unikoddan unikod kodlashda kodlashadi. Dekodlash xotira samarali bo'ladi, chunki u butun CSVni xotiraga o'qishdan saqlaydigan bir generatordan foydalanadi. Bir marta bajarilganda CSV moduli ma'lumotlarni unikod sifatida ko'rib chiqadi va mag'lubiyatni almashtirish kutilgandek ishlaydi.

1
qo'shib qo'ydi

CSV faylini ikkilik rejimda oching va keyin har bir qatorni "eskirgan unikode" dan, masalan, '\\ u00c1' , unicode (Python 3 da str kodini kiriting) oldin CSV o'quvchi ma'lumotlarga qo'lini oladi:

def replace(self, text):
    with open('./data/{}/replace.csv'.format(self.lang), 'rb') as f:
        csvreader = reader(line.decode('unicode_escape') for line in f)
        for l in csvreader:
            text = text.replace(l[0], l[1])
    return text

str.decode ('unicode_escape') dan foydalanib, kelgan ma'lumotni qochilgan unikoddan unikod kodlashda kodlashadi. Dekodlash xotira samarali bo'ladi, chunki u butun CSVni xotiraga o'qishdan saqlaydigan bir generatordan foydalanadi. Bir marta bajarilganda CSV moduli ma'lumotlarni unikod sifatida ko'rib chiqadi va mag'lubiyatni almashtirish kutilgandek ishlaydi.

1
qo'shib qo'ydi

Boshqacha qilib aytganda, asl matn belgilarini notekis belgilar va aksent belgilariga ajrata qilishdir. Keyinchalik ASCII-ga xatolarni e'tiborsiz qoldiring va barcha ASCII bo'lmagan aksent belgilari o'chiriladi. Agar kerak bo'lsa Unicode-ga qaytarib olish uchun uni qayta-qayta dekodlash.

>>> import unicodedata
>>> s ='áéíóúüñ'
>>> unicodedata.normalize('NFD',s)
'a\u0301e\u0301i\u0301o\u0301u\u0301u\u0308n\u0303'
>>> unicodedata.normalize('NFD',s).encode('ascii',errors='ignore')
b'aeiouun'
>>> unicodedata.normalize('NFD',s).encode('ascii',errors='ignore').decode('ascii')
'aeiouun'
0
qo'shib qo'ydi
Va nihoyat, bu modulni o'z maqsadim uchun tanladim.
qo'shib qo'ydi muallif Marco Canora, manba

Boshqacha qilib aytganda, asl matn belgilarini notekis belgilar va aksent belgilariga ajrata qilishdir. Keyinchalik ASCII-ga xatolarni e'tiborsiz qoldiring va barcha ASCII bo'lmagan aksent belgilari o'chiriladi. Agar kerak bo'lsa Unicode-ga qaytarib olish uchun uni qayta-qayta dekodlash.

>>> import unicodedata
>>> s ='áéíóúüñ'
>>> unicodedata.normalize('NFD',s)
'a\u0301e\u0301i\u0301o\u0301u\u0301u\u0308n\u0303'
>>> unicodedata.normalize('NFD',s).encode('ascii',errors='ignore')
b'aeiouun'
>>> unicodedata.normalize('NFD',s).encode('ascii',errors='ignore').decode('ascii')
'aeiouun'
0
qo'shib qo'ydi
Va nihoyat, bu modulni o'z maqsadim uchun tanladim.
qo'shib qo'ydi muallif Marco Canora, manba

Boshqacha qilib aytganda, asl matn belgilarini notekis belgilar va aksent belgilariga ajrata qilishdir. Keyinchalik ASCII-ga xatolarni e'tiborsiz qoldiring va barcha ASCII bo'lmagan aksent belgilari o'chiriladi. Agar kerak bo'lsa Unicode-ga qaytarib olish uchun uni qayta-qayta dekodlash.

>>> import unicodedata
>>> s ='áéíóúüñ'
>>> unicodedata.normalize('NFD',s)
'a\u0301e\u0301i\u0301o\u0301u\u0301u\u0308n\u0303'
>>> unicodedata.normalize('NFD',s).encode('ascii',errors='ignore')
b'aeiouun'
>>> unicodedata.normalize('NFD',s).encode('ascii',errors='ignore').decode('ascii')
'aeiouun'
0
qo'shib qo'ydi
Va nihoyat, bu modulni o'z maqsadim uchun tanladim.
qo'shib qo'ydi muallif Marco Canora, manba
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming