/ / Python Опитайте освен пряка грешка към различен файл - питон, черупка

Python Опитайте с изключение на пряка грешка към различен файл - питон, черупка

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

Искам да получа реалната част от цялото число толкова, колкото можех и да забравя тези числа от типа низ.

(* Съжалявам, че се опитвах да използвам умножение по 2, но се оказа, че "2")

Ето един пример

>>"123" * 5
123123123123123

Искам да има два файла поотделно, едно съхраняванерезултатът, който съхранява грешката. Как да се комбинират Linux обвивка std вход / изход / грешка функция за изпълнение на това, което искам. Предполагам, че последната команда на черупката трябва да изглежда така:

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

Тези два файла трябва да изглеждат така:

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

Аз не знам как да се приложи, че в питон, опитайте с изключение на?

Отговори:

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 модул или дори свой собствен номер като клас?

Като се има предвид, че не-цифровата интерпретация занизовете е по-скоро по-скоро изключение, отколкото правило, може да е по-надеждно просто да се третират като специални случаи и изключения за други не-числови типове

import sys
numbers = [1,2,3, "4", "5", 6, 7]
for number in numbers:
if not isinstance(number, str) and not isinstance(number, unicode):
try:
print number * 2
except Exception, e:
print >>sys.stderr, repr(number)
else:
print >>sys.stderr, number

Това е за Python 2 - типовете струни са променени в Python 3.


0 за отговор № 2

Първо искате нещо повече:

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

Второ, бихте ли посочили проблема ясно Нямам представа за какво се занимава и т.н..


0 за отговор № 3

Можете да използвате 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

Умишлено се въздържах да пиша цялото решение. Мисля, че можете да го съберете заедно от там.