Использование юникода в Python - PullRequest
1 голос
/ 09 февраля 2010

У меня есть CSV-файл с некоторыми адресными данными в основном на финском языке. Мне нужно прочитать этот файл и получить некоторую информацию о геокодировании этих адресов. Но это не работает для финского алфавита и говорит, что не может их прочитать! Кто-нибудь может помочь мне с этим?

import urllib,urllib2,time

addr_file = 'address.csv'
out_file = 'addresses_geocoded.csv'
out_file_failed = 'failed.csv'
sleep_time = 2
root_url = "http://maps.google.com/maps/geo?"
gkey = "asfasdfasdfasdf"       # not an actual value
return_codes = {'200':'SUCCESS',
                         '400':'BAD REQUEST',
                         '500':'SERVER ERROR',
                         '601':'MISSING QUERY',
                         '602':'UNKOWN ADDRESS',
                         '603':'UNAVAILABLE ADDRESS',
                         '604':'UNKOWN DIRECTIONS',
                         '610':'BAD KEY',
                         '620':'TOO MANY QUERIES'

                         }
def geocode_for_musiquitous(addr_file,out_fmt='csv'):
        #encode our dictionary of url parameters
        values = {'q' : addr_file, 'output':out_fmt, 'key':gkey}
        data = urllib.urlencode(values)
        #set up our request
        url = root_url+data
        req = urllib2.Request(url)
        #make request and read response
        response = urllib2.urlopen(req)
        geodat = response.read().split(',')
        response.close()

        # this section is just handle the data returned from google
        code = return_codes[geodat[0]]
        if code == 'SUCCESS':
                code,precision,lat,lng = geodat
                return {'code':code,'precision':precision,'lat':lat,'lng':lng}
        else:
                return {'code':code}

def main():
#open  i/o files
        outf = open(out_file,'w')
        outf_failed = open(out_file_failed,'w')
        inf = open(addr_file,'r')
        for address in inf:
            #get latitude and longitude of address
                data = geocode_for_musiquitous(address)


            #output results and log to file



                if len(data)>1:
                        print "Latitude and Longitude of "+address+":"
                        print "\tLatitude:",data['lat']
                        print "\tLongitude:",data['lng']
                        outf.write(address.strip()+data['lat']+','+data['lng']+'\n')
                        outf.flush()
                else:
                        print "Geocoding of '"+addr_file+"' failed with error code "+data['code']
                        outf_failed.write(address)


                        outf_failed.flush()

                time.sleep(sleep_time)

                #clean up
        inf.close()
        outf.close()
        outf_failed.close()

if __name__ == "__main__":
        main()

Ответы [ 4 ]

1 голос
/ 09 февраля 2010

Аргумент urllib.url должен быть предварительно закодирован в UTF-8:

addr_file = addr_file.encode("utf-8")
values = {'q' : addr_file, 'output':out_fmt, 'key':gkey}
data = urllib.urlencode(values)

И убедитесь, что вы открываете файл CSV с правильной кодировкой (может быть «windows-1252» или «iso-8859-1»):

inf = codecs.open(addr_file, 'r', 'iso-8859-1')
0 голосов
/ 09 февраля 2010

Вам необходимо открыть файл , используя правильную кодировку, используя кодеки модуль . Правильная кодировка для финского языка: ISO-8859-1

inf = codecs.open(addr_file,'r', 'iso-8859-1')

Если это неправильная кодировка для вашего файла, вам необходимо выяснить, какая кодировка является правильной для вашего файла, а затем проверить, доступен ли кодек для него, как показано ниже:

import codecs
codec = codecs.lookup("iso-8859-1'")
print codec.name

Если codecs.lookup() возвращает объект кодека для искомой кодировки, он доступен и может использоваться в codecs.open().

0 голосов
/ 09 февраля 2010

Используйте модуль codecs.

codecs.open()

codecs.open(filename, mode[, encoding[, errors[, buffering]]])

Откройте закодированный файл, используя данный режим, и верните упакованную версию, обеспечивающую прозрачное кодирование / декодирование. Режим файла по умолчанию - «r», что означает открытие файла в режиме чтения.

Вы можете использовать обернутые файловые объекты для чтения закодированных файлов в строки Unicode.

0 голосов
/ 09 февраля 2010

Я не знаю Python, но я уверен, что это проблема кодирования.

Убедитесь, что ваш адресный файл имеет кодировку UTF-8 и что используемая вами функция urlencode() может работать с символами UTF-8 (хотя последний не должен быть проблемой, так как Python может обрабатывать UTF-8 изначально, насколько это возможно. Я знаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...