2017-10-29 1 views
1

Ich recherchierte oft dieses Problem, aber ich konnte keine klare Antwort finden. Bitte hilf mir, wie ich zwei Unicode-Strings vergleichen kann. Ich will das Datum aus diesem Format "17 Ağustos 2017" oder "11 Eylül 2017" bekommen und ich versuche, zu diesem Format "17-08-2017", "11-9-2017" zu konvertieren. Aber wenn ich den Monat Zeichenfolge erhalten gibt esPython Scrapy Unicode Vergleich String türkische Zeichen

"Ağustos" > "A\xc4\x9fustos" ,"Eylül" > "Eyl\xfcl"

months = ['Ocak', '\xc5\x9eubat', 'Mart', 'Nisan', 
       'May\xc4\xb1s', 'Haziran', 'Temmuz', 
       'A\xc4\x9fustos', 'Eyl\xfcl', 'Ekim', 
       'Kas\xc4\xb1m', 'Aral\xc4\xb1k' 
      ] 

       month= valuesDetails[indexDate].split(" ") 

       if int(months.index(month[1])+1 < 10): # month 
        month[-2]= "0"+str(months.index(month[1])+1) 
       else: 
        month[-2]= str(months.index(month[1])+1) 
       if int(month[0]) < 10: # day 
        mont[0] = "0"+month[0] 


       item['date'] = month[0]+"-"+month[1]+"-"+month[2] 
+0

Gibt es in der Umgebung, in der Sie die Ausgabe drucken, Unterstützung für Unicode? Zum Beispiel, wenn Sie "Ağustos" in der Shell ohne Unterstützung für Unicode drucken, dann erhalten Sie Dinge wie "A \ xc4 \ x9fustos". Das heißt, es ist immer besser, Standardbibliotheken zu verwenden, um mit Daten zu arbeiten, als zu versuchen, eigene zu implementieren. – Djunzu

Antwort

0

Ein einfacher Weg, dies zu tun, ist Python datetime & locale Bibliotheken zu verwenden gegeben wir wissen Turkish's locale code, tr_TR, und einige datetime masking.

#coding:utf8 
from datetime import datetime 
import locale 

# Datetime is aware of locale, 
# change locale to Turkish 
locale.setlocale(locale.LC_TIME, "tr_TR") 

dates = ['17 Ağustos 2017','11 Eylül 2017'] 

for date in dates: 
    # Make `date` str a datetime object 
    # using a datetime mask 
    dt = datetime.strptime(date, '%d %B %Y') 
    # Convert `dt` datetime object to 
    # str in preferred format using a 
    # datetime mask 
    dt_str = dt.strftime('%d-%m-%Y') 
    # Walla! 
    print(dt_str) 

Ausgang:

17-08-2017 
11-09-2017 
+0

es gibt zurück> Datei "/usr/lib/python2.7/locale.py", Zeile 581, in setlocale Rückgabe _setlocale (Kategorie, Gebietsschema) Fehler: nicht unterstützte Gebietsschemaeinstellung –

+0

@adnankaya Welche OS? Gebietsschemacodes unterscheiden sich nach System. – Cole

+0

Linux Mint Standardsprache us_US.UTF-8 –

0

Ohne das Gebietsschema zu ändern, könnten Sie ein globales Wörterbuch der jeweiligen Monate erstellen und den türkischen Monat mit dem entsprechenden englischen Monat ersetzen:

#coding:utf8 
from datetime import datetime 

MONTHS = { 
    'Ocak': 'January', 
    'Şubat': 'February', 
    'Mart': 'March', 
    'Nisan': 'April', 
    'Mayıs': 'May', 
    'Haziran': 'June', 
    'Temmuz': 'July', 
    'Ağustos': 'August', 
    'Eylül': 'September', 
    'Ekim': 'October', 
    'Kasım': 'November', 
    'Aralık': 'Decemeber' 
} 

def format_date(date): 
    # Iterate through months and grab 
    # respective turkish and english 
    # month 
    for tr_month, eng_month in MONTHS.items(): 
     # Replace turkish month (if found) 
     # with english month 
     if tr_month in date: 
      print("'%s' > %s" % (tr_month, repr(tr_month))) 
      date = date.replace(tr_month, eng_month) 
      break 
    # Convert date to datetime object and 
    # back into the preferred format 
    return datetime.strptime(date,'%d %B %Y').strftime('%d-%m-%Y') 

for date in ['17 Ağustos 2017','11 Eylül 2017']: 
    print(format_date(date)) 

Ausgang :

'Ağustos' > 'A\xc4\x9fustos' 
17-08-2017 
'Eylül' > 'Eyl\xc3\xbcl' 
11-09-2017 

Ich gehe davon aus, dass ich die Monate richtig gelesen habe, aber ich kann kein Türkisch, also solltest du das mal überprüfen.

+0

Danke. Aber mein wichtiger Punkt ist das Lernen von Unicode –

+0

@adnankaya Es vergleicht immer noch Unicode, die 'print()' -Funktion ist nur den "gerenderten" Unicode (d. H. Eylül anstelle von Eyl \ xc3 \ xbcl) auszudrucken. Um den "nicht gerenderten" Unicode anzuzeigen, können Sie 'repr (some_unicode_str)' verwenden. Ich habe den Code aktualisiert, um das auszudrucken. – Cole

Verwandte Themen