Проблема с логическим выражением со строковым значением из последнего

1

У меня есть следующая проблема:

  # 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

Теги:

5 ответов

1

Позвольте мне немного пояснить, что вы здесь делаете.

Если вы пишете:

NumPFCs = eval(line[2])

порядок оценки:

  • возьмите второй символ строковой строки, т.е. цитату '' '
  • eval эта цитата как выражение python, которая является ошибкой.

Если вы напишете это вместо:

NumPFCs = eval(line)[2]

то порядок оценки:

  • eval строка, создающая список python
  • возьмите второй элемент этого списка, который является односимвольной строкой: "0"
  • строка не может сравниваться с числом; это тоже ошибка.

В ваших терминах вы хотите сделать следующее:

NumPFCs = eval(eval(line)[2])

или, немного лучше, сравните NumPFC со строкой:

if NumPFCs == "0":

но способы, которые могут пойти не так, почти бесчисленны. Вы должны забыть о eval и попытаться использовать другие методы: расщепление строк, регулярные выражения и т.д. Другие уже предоставили некоторые предложения, и я уверен, что далее последует.

0

Существует много способов скинирования кошки:)

Прежде чем мы начнем, не используйте 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

Я бы рекомендовал использовать регулярное выражение для захвата всех вариантов того, как можно указать 0: с двойными кавычками, без кавычек, с одинарными кавычками, с дополнительными пробелами вне кавычек, с пробелами внутри кавычек, как вы хотите обработать квадратные скобки и т.д.

0

Ваш вопрос трудно читать, но, используя eval, определенно не очень хорошая идея. Либо просто выполните прямое сравнение строк:

line=TcsLine.split(",")
if line[2] == "0":
    print line

или используйте int

line=TcsLine.split(",")
if int(line[2]) == 0:
    print line

В любом случае ваши плохие данные не удастся вам.

Я бы также рекомендовал читать PEP 8.

  • 0
    Надежно ли конвертируется строка, содержащая «0»]?
0

В вашем сегменте кода есть несколько проблем:

  • вы делаете предположение, что в списке всегда есть как минимум 3 элемента
  • eval будет вызывать исключение, если строка недействительна python
  • вы говорите, что хотите второй элемент, но вы получаете доступ к 3-му элементу.

Это более безопасный способ сделать это

line=TcsLine.split(",")
if len(line) >=3 and line[2].rfind("0") != -1:
     print line
  • 0
    Означает ли это, что если третье значение равно «101», оно будет напечатано?
  • 0
    я согласен, что лучше с строкой [2] == "0" вместо rfind

Ещё вопросы

Сообщество Overcoder
Наверх
Меню