Проблема с логическим выражением со строковым значением из последнего - PullRequest
1 голос
/ 27 ноября 2008

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

  # line is a line from a file that contains ["baa","beee","0"]
  line = TcsLine.split(",")
  NumPFCs = eval(line[2])
  if NumPFCs==0:
     print line

Я хочу напечатать все строки из файла, если вторая позиция списка имеет значение == 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 голос
/ 28 ноября 2008

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

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

NumPFCs = eval(line[2])

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

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

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

NumPFCs = eval(line)[2]

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

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

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

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

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

if NumPFCs == "0":

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

0 голосов
/ 28 ноября 2008

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

Прежде чем мы начнем, не используйте eval для строк, которые не являются вашими , поэтому, если строка когда-либо покидала вашу программу; то есть он остался в файле, отправлен по сети, кто-то может отправить что-то неприятное. И если кто-то может, вы можете быть уверены, что кто-то это сделает.

И, возможно, вы захотите просмотреть свой формат данных. Поместить в файл такие строки, как ["baa", "beee", "0", "\ n"], не имеет большого смысла для меня.

Первый и самый простой способ - просто убрать ненужные вещи и сравнить строки. Это будет работать до тех пор, пока строка '0' всегда выглядит одинаково, и вы на самом деле не после целого значения 0, а только шаблон символов:

TcsLine = '["baa","beee","0"]'

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

Второй способ будет аналогичен первому, за исключением того, что мы приводим числовую строку к целому числу, получая целочисленное значение, которое вы искали (но печатая '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 голосов
/ 27 ноября 2008

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

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

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

line=TcsLine.split(",")
if len(line) >=3 and line[2].rfind("0") != -1:
     print line
0 голосов
/ 28 ноября 2008

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

0 голосов
/ 27 ноября 2008

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...