У меня есть следующая проблема:
# line is a line from a file that contains ["baa","beee","0"]
line = TcsLine.split(",")
NumPFCs = eval(line[2])
if NumPFCs==0:
print line
Я хочу напечатать все строки из файла, если вторая позиция списка имеет value == 0.
Я печатаю строки, но после этого происходит следующее: Traceback (последний последний звонок):
['baaa', 'beee', '0', '\n']
, но после следующей ОШИБКИ
ilation.py", line 141, in ?
getZeroPFcs()
ilation.py", line 110, in getZeroPFcs
NumPFCs = eval(line[2])
File "<string>", line 0
Вы можете мне помочь? спасибо
What0s
Позвольте мне немного пояснить, что вы здесь делаете.
Если вы пишете:
NumPFCs = eval(line[2])
порядок оценки:
Если вы напишете это вместо:
NumPFCs = eval(line)[2]
то порядок оценки:
В ваших терминах вы хотите сделать следующее:
NumPFCs = eval(eval(line)[2])
или, немного лучше, сравните NumPFC со строкой:
if NumPFCs == "0":
но способы, которые могут пойти не так, почти бесчисленны. Вы должны забыть о eval
и попытаться использовать другие методы: расщепление строк, регулярные выражения и т.д. Другие уже предоставили некоторые предложения, и я уверен, что далее последует.
Существует много способов скинирования кошки:)
Прежде чем мы начнем, не используйте eval для строк, которые не являются вашими, поэтому, если строка когда-либо оставила вашу программу; то есть он остался в файле, отправленном по сети, кто-то может отправить что-то неприятное. И если кто-то может, вы можете быть уверены, что кто-то будет.
И вы можете просмотреть свой формат данных. Ввод строк, таких как [ "baa", "beee", "0", "\n" ] в файле, не имеет для меня большого смысла.
Первым и самым простым способом было бы просто удалить материал, который вам не нужен, и сравнить строки. Это будет работать до тех пор, пока '0'-строка всегда будет выглядеть одинаково, и вы не действительно после целочисленного значения 0, только шаблон символа:
TcsLine = '["baa","beee","0"]'
line = TcsLine.strip('[]').split(",")
if line[2] == '"0"':
print line
Второй способ будет похож на первый, за исключением того, что мы передаем числовую строку целому числу, давая целочисленное значение, которое вы искали (но печатаете строку "без всех кавычек" ):
TcsLine = '["baa","beee","0"]'
line = [e.strip('"') for e in TcsLine.strip('[]').split(",")]
NumPFCs = int(line[2])
if NumPFCs==0:
print line
Может ли быть, что строка на самом деле представляет собой json-массив? Тогда я бы, вероятно, пошел simplejson, чтобы правильно разобрать его, если я запускал Python < 2.6 или просто импортировал json на Python >= 2.6. Затем нарисуйте полученную "0" -струю на целое число, как в предыдущем примере.
TcsLine = '["baa","beee","0"]'
#import json # for >= Python2.6
import simplejson as json # for <Python2.6
line = json.loads(TcsLine)
NumPFCs = int(line[2])
if NumPFCs==0:
print line
Я бы рекомендовал использовать регулярное выражение для захвата всех вариантов того, как можно указать 0: с двойными кавычками, без кавычек, с одинарными кавычками, с дополнительными пробелами вне кавычек, с пробелами внутри кавычек, как вы хотите обработать квадратные скобки и т.д.
Ваш вопрос трудно читать, но, используя eval, определенно не очень хорошая идея. Либо просто выполните прямое сравнение строк:
line=TcsLine.split(",")
if line[2] == "0":
print line
или используйте int
line=TcsLine.split(",")
if int(line[2]) == 0:
print line
В любом случае ваши плохие данные не удастся вам.
Я бы также рекомендовал читать PEP 8.
В вашем сегменте кода есть несколько проблем:
Это более безопасный способ сделать это
line=TcsLine.split(",")
if len(line) >=3 and line[2].rfind("0") != -1:
print line