Python尝试除了直接错误到不同的文件

时间:2013-09-07 21:21:24

标签: python shell

numbers = [1,2,3, '4', '5', 6, 7]
for number in numbers:
    print number.real 

我希望尽可能多地得到整数的实部,并忘记那些字符串类型的数字。

*对不起,我试图使用乘以2,但结果是“2”*整数是合法的操作*

这是一个例子

>>'123' * 5 
123123123123123

我想分别有两个文件,一个存储结果,一个存储错误。如何结合linux shell std输入/输出/错误功能来实现我想要的。 我假设最终的shell命令应如下所示:

python script.py >success.file 2>fail.file 

这两个文件应如下所示:

$cat success.file
2
4
6
12
14
$cat fail.file
8
10

我不知道如何在python中实现它,尝试除了?

3 个答案:

答案 0 :(得分:3)

好吧,你不能只捕获字符串的异常,因为乘法运算符仍然会对它们起作用 - 在这种情况下它只是做错了(它会复制字符串,所以{{1}变成'4')。因此,您需要明确检查类型。

假设所有数字都是整数(没有浮点数),你可以这样做:

'44'

如果你也想要处理浮点数,你可以随时检查这个类型,但这种方法总是有点脆弱 - 如果有人使用import sys numbers = [1,2,3, '4', '5', 6, 7] for number in numbers: if isinstance(number, int): print number * 2 else: print >>sys.stderr, number 模块中的某些内容甚至是自己的数字级?

鉴于字符串的非数字解释可能是异常而不是规则,因此将这些解释为特殊情况并捕获其他非数字类型的异常可能更为健壮:

decimal

这是针对Python 2的 - Python 3中的字符串类型已经改变。

答案 1 :(得分:0)

首先,你想要更像的东西:

numbers = [1,2,3, '4', '5', 6, 7]
for number in numbers:
    print int(number) * 2

其次,你能否明确说明问题 我不知道你处理的文件。

答案 2 :(得分:0)

您可以使用sys.argv来解析文件名后面的命令。当你运行

python myscript.py command1 command2

这些存储在sys.argv中,如下所示:

[in:] import sys
[in:] sys.argv
[out:]  ["myscript.py", "command1", "command2"]

现在这是一个简单的方法,但是如果你想要复杂的实现,还有一个名为argparse的库。从那里,它真的很容易:

success = sys.argv[1]
fail = sys.argv[2]

# open the files...

for i in numbers:
     # if it's not a number, put it in the fail file
     # if it is duplicate it and put it in success file

我有意避免编写整个解决方案。我想你可以从那里把它放在一起。