Проблема заключается в том, как вы проверяете на наличие указанного текста , В вашем коде f
- это файловый объект, используемый для чтения и записи в/из файла. Он не содержит содержимого файла. Поэтому, когда вы проверяете,
str in f
Это не проверка того, что вы думаете. Подробную информацию см. Ниже.)
Вместо этого вам необходимо прочитать строки и затем перебрать эти строки и проверить нужную строку. Ex.
with open('last 600 items.txt', 'r+') as f:
lines = f.readlines()
for l in lines:
# check within each line for the presence of the items
В приведенном выше коде отрывке, f.readlines()
использует объект файла для чтения содержимого файла и возвращает список строк, которые являются строками внутри файла.
EDITED (кредит Peter Wood)
Python Membership Details
В Python, когда вы используете синтаксис x in y
, он проверяет на 2 вещи:
Case 1: сначала проверяет чтобы узнать, имеет ли метод y
метод __contains__(b)
. Если это так, он возвращает результат y.__contains__(x)
.
Случай 2: Однако, если y
делает не есть метод __contains__
, но делает определить метод __iter__
, Python использует вместо что метод перебора содержимого y
и возвращает True
, если в любой момент одно из значений, повторяющихся, равно x
. В противном случае он возвращает False
.
Если мы используем ваш код в качестве примера, в определенный момент он проверяет правду утверждения "test2" in f
. Здесь f
- объект типа file
. (Python File Object Description). Файловые объекты относятся к случаю 2 (т.е. они не имеют __contains__
, они сделать имеют __iter__
.
Поэтому код будет проходить через каждую строку и посмотреть, будет ли ваши входные строки равного любых из строк в файле.И так как каждая строка заканчивается символом \n
, ваши строки никогда не вернутся True
.
Для разработки, в то время как "test2" in "test2\n"
вернется True
, тест, который на самом деле выполняется здесь: "test2" == "test2\n"
, который False
.
Вы можете проверить, как это работает в вашем файле вручную. Для exmaple, если мы хотим, чтобы увидеть, если "test2" in f
должен возвращать True
:
with open(filename) as f:
x = iter(f)
while(True):
try:
line = x.next()
except:
break
print(line)
print(line == "test2")
Вы заметите, что он печатает каждую строку (включая символ новой строки в конце), и что результат line == "test2"
всегда False
.
Если бы мы попытались: "test2\n" in f
, результатом будет True
.
End Edit
'if item ['ID'] в f' не делает то, что вы думаете. –