Python неявно превращает четырехзначную строку в int - PullRequest
0 голосов
/ 16 января 2012

В настоящее время я работаю над сценарием, который извлекает данные из двух источников, одним из которых является норвежский почтовый индекс.Норвежские почтовые индексы состоят из четырех цифр, а некоторые начинаются с нуля.

Вот код:

#This section loads data on Norwegian post codes and places into a dictionary where postcode is key
f = open("postoversikt.txt", "r");
f1 = open("PCODES_USER_TRIM.txt","r") #load the file with all the users. 
fo = open("pcodes_out","w")
place = {}
times = {}
for line in f:
    words = line.rsplit("\t");
    place[str(words[0])] = words[1]; #Reverse these to change the key and value - Default key: postcode value: place

number = 0;
number_unique = 0;
number_alike = 0;

for line in f1:
    number = number + 1;
    words1 = line.rsplit(";");
    if not words1[1] in times:
        number_unique = number_unique + 1;
        times[words1[1]] = 1;
    else: 
        number_alike = number_alike + 1;
        times[words1[1]] = times[words1[1]] + 1;

for key, value in times.items():
     print key+";"+value+";"+words[key];
     fo.write(key+";"+value+";"+words[key]+"\n");


print "Totalt antall objekter behandlet er: "+ str(number);
print "Hvorav antall unike var: "+ str(number_unique);
print "Antall like nummer ble funnet: " + str(number_alike);

Некоторые строки из PCODES_USER_TRIM:

75621;4517;45 - 65
35214;7650;25 - 45
55624;9015;25 - 45
09523;5306;45 - 65
09051;2742;25 - 45
88941;1661;18 - 25

Некоторые строки из postoversikt.txt:

0001    OSLO    0301    OSLO    P
0010    OSLO    0301    OSLO    B
0015    OSLO    0301    OSLO    K
0016    OSLO    0301    OSLO    K
0017    OSLO    0301    OSLO    K
0018    OSLO    0301    OSLO    G
0021    OSLO    0301    OSLO    K
0022    OSLO    0301    OSLO    K

Одна из возникающих проблем заключается в том, что почтовые индексы, начинающиеся с нуля, чередуются с начальным нулем.Я предполагаю, что это происходит из-за внутреннего преобразования в int (я только начинающий в Python, поэтому, пожалуйста, простите, если мои проблемы немного обыденные).Я хотел бы, чтобы они были в стандартном формате четырех чисел хххх.Моя вторая проблема, которая, как мне кажется, следует из моей первой, заключается в том, что я хочу добавить название почтового индекса к окончательной распечатке.Это не работает, так как я не могу использовать ключ для обозначения места словами.

Я использовал для преобразования объекта, который я печатаю, в строки, используя метод str (), но в текущей версии я воздержался от этого, так как хочу решить проблему с помощью корня.

Может кто-нибудь помочь мне с моей маленькой проблемой?Как я могу использовать rsplit, чтобы поместить строки в словарь слов без преобразования его в целые числа?

Ответы [ 3 ]

4 голосов
/ 16 января 2012

Если вы хотите отформатировать целое число, чтобы оно было длиной не менее 4 целых чисел (с добавлением нулей), вы должны сделать это следующим образом:

integer = 5
s = "%04d" % integer
2 голосов
/ 16 января 2012

Python "строго типизирован" и не приводит к автоматическому приведению типов ключей или каких-либо типов в этом отношении:

>>> d = {'01234':'value'}
>>> print d.items()
[('01234', 'value')]

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

 fo.write("key+";"+value+";"+words[key]\n")

Пожалуйста, вставьте фактический код, который вы используете.

Кроме того, дайте нам несколько строк из входных документов и их форматов, чтобы нам не приходилось догадываться.

EDIT:

Этот код будет делать то, что вы хотите. Опять же, нет никаких признаков того, что ведущие нули будут потеряны ...

places = {}
for line in f:
    post, place, _rest = line.split('\t',2)
    places[post] = place
f.close()

times = {}
for line in f1:
    _id, post, _rest = line.split(';',2)
    times[post] = times.get(post, 0) + 1
f1.close()

for k,v in times.iteritems():
    fo.write("%s;%s;%s\n" % (k,v,places[k]))
fo.close()

number = sum(times.itervalues())
number_unique = len(times)
number_alike = number - number_unique

print number, number_unique, number_alike
0 голосов
/ 16 января 2012

Тот факт, что python обрезает 4-значное число (например, 0004 -> 4), не должен быть проблемой, если операция подсчета дает правильные результаты.

То, что вам нужно, простоотформатируйте вывод так, как вы хотите.Например:

i=4
print "%4d" % i

Дает результат: 0004

i=1254
print "%04d" % i

Дает результат: 1254

Более подробная информация о форматировании строки в python: http://docs.python.org/release/2.4.4/lib/typesseq-strings.html

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