2017-10-29 8 views
1

この問題は何度も調べましたが、明確な答えが見つかりませんでした。私はどのように私は2つのユニコード文字列を比較することができます助けてください。私はこのフォーマット "17Ağustos2017"または "11Eylül2017"から日付を取得したいと思います。このフォーマット「17-08-2017」、「11-9-2017」に変換しようとしています。私はそれがPython Scrapyユニコード比較文字列トルコ文字

"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

出力を印刷している環境でユニコードがサポートされていますか?たとえば、ユニコードをサポートしないでシェルに "Ağustos"を印刷すると、 "A \ xc4 \ x9fustos"のようなものが得られます。つまり、独自のライブラリを実装しようとするよりも、標準ライブラリを使用して日付を処理する方が良いということです。 – Djunzu

答えて

0

を返す月の文字列を取得する場合でも、これを行う簡単な方法は、私たちがTurkish's locale codetr_TRを知っている、といくつかdatetime masking与えられたPythonのdatetime & localeライブラリを使用することです。

#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) 

出力:

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

戻り値>ファイル "/usr/lib/python2.7/locale.py"、行581、setlocale 戻り値_setlocale(カテゴリ、ロケール) エラー:サポートされていないロケール設定 –

+0

@adnankayaどのようなOSですか?ロケールコードはシステムによって異なります。 – Cole

+0

Linux Mintのデフォルト言語us_US.UTF-8 –

0

ロケールを変更せずに、あなたはそれぞれのヶ月のグローバル辞書を作成し、対応する英語の月にトルコ月置き換えることができます:

#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)) 

出力:

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

私は月が正しいと思っていますが、私はトルコ語を知らないので、それをもう一度チェックしたいかもしれません。

+0

ありがとうございます。しかし、私の重要なポイントは、ユニコードを比較するユニコードを学ぶことです。 –

+0

@adnankayaそれはまだユニコードを比較しています、 'print()'関数は単に "レンダリングされた"ユニコード(Eyl \ xc3 \ xbclの代わりにEylül) "unrendered" unicodeを表示するには、 'repr(some_unicode_str)'を使うことができます。私はそれを印刷するコードを更新しました。 – Cole