【问题标题】:Python makes four digit string into int implicitlyPython 将四位数字字符串隐式转换为 int
【发布时间】:2012-01-16 15:04:35
【问题描述】:

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

代码如下:

#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() 方法将我打印的对象转换为字符串,但在当前版本中我没有这样做,因为我想从根源处理问题。

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

【问题讨论】:

  • Python 不进行隐式类型转换,所以这不是你的问题。你能发布几行两个导入文件和不正确的输出输出吗?另外你的for循环缩进是错误的,所以我不知道循环中有哪些行。
  • 您发布的代码存在一些语法问题。特别是缩进和分号的使用。你能从你正在使用的 .txt 文件中发布几行吗?
  • 抱歉语法错误。当我将代码粘贴到页面中时,我遇到了一些问题。它现在有效吗?我还添加了我正在使用的部分 .txt 文件。
  • Python 代码中几乎不应该有分号。这不是语法错误,而是可怕的风格。
  • 对不起。我只是太习惯Java了。从现在开始,我会尽量避免这样做。

标签: python parsing csv


【解决方案1】:

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

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

【讨论】:

  • 感谢您的帮助。这将帮助我更整洁地展示它。这也有助于我通过最后一个 for 循环中的键访问名称吗?
  • @olovholm:我不会完全解释它,但你应该真正研究一下 Python dict's。无论如何,我建议您通读 Python 文档。
【解决方案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

【讨论】:

  • 嘿,对不起。写入文件的代码与写入屏幕的代码相同。我在此处发布之前添加了此内容以显示我的意图。我现在更正了。
  • 那行仍然是假的。 words[key] 应该指的是什么?此时它是您的第一个文件循环中的数组,而不是字典。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多