Python将四位数字符串隐式地转换为int

时间:2012-01-16 15:04:35

标签: python parsing csv

我目前正在制作一个脚本,该脚本从两个来源中提取数据,其中一个是挪威邮政编码。挪威邮政编码由四位数组成,有些以零开头。

以下是代码:

#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的初学者,所以请原谅我的问题是否有点平凡)。我希望这些是四个数字xxxx的标准格式。我想从我的第一个问题出现的第二个问题是,我想将邮政编码的名称添加到最终打印出来。这不起作用,因为我无法使用键来引用单词中的位置。

我曾经使用str()方法将我打印的对象转换为Strings,但我在当前版本中没有这样做,因为我想通过root来处理问题。

有人可以帮我解决一下我的小问题吗?我如何使用rsplit将字符串放入单词字典而不将其转换为整数?

3 个答案:

答案 0 :(得分:4)

如果你想要格式化一个整数,使其长度至少为4个整数(预填充零),你必须这样做:

integer = 5
s = "%04d" % integer

答案 1 :(得分:2)

Python是“强类型”,不会自动强制键类型或任何类型:

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

我的代码中没有看到转换为int的内容,但我很确定这不是您使用的代码,因为它至少包含一个语法错误:

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

请粘贴您正在使用的实际代码。

此外,请从输入文档及其格式中提供几行代码,因此我们无需猜测。

编辑:

此代码将执行您想要的操作。再一次,没有迹象表明领先的零丢失......

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

答案 2 :(得分:0)

只要计数操作产生正确的结果,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