Differentiating Python variables as str or int
我有一个文件,每行有3个值。它是一个相当随机的文件,这些值中的任何一个都可以是str或int。
1 2 3 4 5 6 7 8 9
| George, 34s, Nikon
42, absent, Alan
apple, 111, 41
marked, 15, never
... |
因此,我在行中读取,并使用split获得第一个值:
1 2 3 4 5 6 7
| theFile = r"C:\..."
tDC = open(theFile,"r")
for theLine in tDC:
a, b, c = theLine.split(',') |
到现在为止,一直都还不错。
当我试图处理变量a时,我陷入了困境。如果它是str或者int,我需要用不同的方法来处理它。我尝试设置a = int(a),但是如果它是一个字符串(例如"george"),那么我会得到一个错误。我试过if type(a) = int或if isinstance(a,int),但都不起作用,因为所有的值都是字符串!
那么,如何评估不看其分配的"类型"的值呢?具体地说,我想读取所有的a,并找到所有数字的最大值(它们是整数,但可能是大的——也许是六位数)。
是否有一种方法可以读取行中的数据,以便数字和字符串以字符串形式出现,或者可能有一种方法可以在不查看类型的情况下评估值本身?
- 您可以使用try/except块,使用except中的ValueError块。
- 你怎么知道某列42是表示int 42还是字符串"42"?毕竟,可以有字符串值(如"32s")的数据也可能有字符串值(如"42")。
- 作为补充说明,您可以考虑使用csv库,而不是手动调用split。我不知道您的数据来自何处,也不知道它们是什么意思,但我不会感到太惊讶,因为您遇到了一个像"Smith, John"这样的列,您的代码将把它视为两列而不是一列,这很难修复,而对于csv,它要么只是工作,要么只是设置一个方言参数来修复它。
- stackoverflow.com/questions/5626815/…
- 如果类型(a)=int不测试是否相等。要测试相等性,请使用==(双等号)。单个=用于分配。
- @图腾:不管怎样,isinstance(a, int)几乎是比type(a) == int更好的测试,但没有人能确切地解释问题中已经解释的原因:不管怎样,type(a)肯定是str…
第一点是,您需要一些规则来告诉您哪些值是整数,哪些值不是整数。在包含32s等内容的数据集中,我不确定是否将任何可能是整数的内容视为整数是有意义的。
但是,为了简单起见,我们假设这是您想要的规则:任何可以是整数的东西都是。因此,int(a)已经相当接近了;唯一的问题是它可能会失败。你怎么处理这个?
python是围绕EAFP设计的:请求原谅比请求允许更容易。尝试一些东西,然后处理它可能失败的事实。正如赛博建议的那样,在try声明中:
1 2 3 4 5 6 7 8
| try:
intvalue = int(a)
except ValueError:
# Oops, it wasn't an int, and that's fine
pass
else:
# It was an int, and now we have the int value
maxvalue = max(maxvalue, intvalue) |
- "任何"padraiccunningham:如果这些值可以float(a)STR或int",看起来很像坏的想法。当然,如果所需的规则是"什么东西可以interpreted应parsed的浮子的浮子,然后(或圆形或任何类型的"),这是不同的,但是这可能会比现在少很多"什么东西可以interpreted的安安国际国际parsed应该的。"
- "是的,"2.0"padraiccunningham:提高ValueError将被跳过。操作系统将是一个"34s",我们知道在他的输入。与操作系统将"2 + 3*4"和"0xcab"和"two"和"0'"和"4/1"和所有其他各种各样的事情,可以被视为一个integers表示)。如果你不理解和考虑的影响的知识可以在浮标的制作点心,尝试添加到转换后的一切12345678901234567890 + 1 + -12345678901234567890浮标。
- "谁关心如何padraiccunningham:大的问题是在它成为一个值,当没有理由创建的问题在第一位?如果规则是"一切都是int或str",说的是一只"2.0"OP,然后在不安的"two"int。
- 这是工作的,谢谢!
1 2 3 4 5 6 7
| values = theLine.split(',')
for value in values:
try:
number = int(value)
# process as number
except ValueError:
# process value as string |
- 这将返回一些奇怪的结果,你要做的substrings iterating
- 很好的抓padraiccunningham @!好的,谢谢。我想他们中的逗号分隔的问题。与split(',')校正。
- 我也只是想在OP的智囊团也列在
- "padraiccunningham这是不清楚的。所有的操作使用的第一列的实例,但其他的文本描述字段值/太,所以我的问题interpreted desiring过程的所有值。