Python Can';在文本文件中找不到字符串

Python Can';在文本文件中找不到字符串,python,string,file,python-2.7,search,Python,String,File,Python 2.7,Search,给定一个项目编号列表,我试图通过一个包含最近项目编号列表的文本文件进行搜索,并识别此最近列表中的任何项目。然后我想添加最近列表中没有的任何项目 下面是我的代码,它似乎在文本文件中找不到任何东西。为什么不起作用 def filter_recent_items(items): recentitems = [] with open('last 600 items.txt', 'r+') as f: for item in items: if it

给定一个项目编号列表,我试图通过一个包含最近项目编号列表的文本文件进行搜索,并识别此最近列表中的任何项目。然后我想添加最近列表中没有的任何项目

下面是我的代码,它似乎在文本文件中找不到任何东西。为什么不起作用

def filter_recent_items(items):
    recentitems = []
    with open('last 600 items.txt', 'r+') as f:
        for item in items:
            if item['ID'] in f:
                print 'In! --', item['ID']
            else:
                recentitems.append(item['ID'])
                print 'Out ---', item['ID']
        for item in recentitems:
            f.write("%s\n" % item)


items = [ {'ID': 1}, {'ID': 'test2'} ]     
filter_recent_items(items)
例如,我的文本文件是:

test2

test1

1
但是上面的代码返回

Out --- 1
Out --- test2

问题在于如何检查指定文本的存在。在您的代码中,f是一个文件对象,用于读写文件。所以当你检查

str in f
它不是检查你认为它是什么。(详情见下文。)

相反,您需要读入文件的行,然后遍历这些行并检查必要的字符串。前

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()
使用file对象读取文件内容并返回字符串列表,这些字符串是文件中的行

编辑(归功于彼得·伍德)

在Python中,当您使用y中的语法
x
时,它会检查两件事:

案例1:它首先检查
y
是否有
\uuu包含\uuu(b)
方法。如果是,它将返回
y的结果。uu包含

案例2:但是,如果
y
没有
\uuuuu contains\uuuu
方法,但是定义了
\uuu iter\uuuu
方法,Python会使用该方法迭代
y
的内容,如果在任何一点上迭代的值等于
x
,则返回
True
。否则,它将返回
False

如果我们以您的代码为例,在某一点上,它正在检查f
中语句
“test2”的真实性。这里的
f
file
类型的对象。(). 文件对象属于案例2(即,它们没有
\uuuuuu包含
,它们有
\uuuuuuu iter\uuuuuu

因此,代码将遍历每一行,并查看您的输入字符串是否与文件中的任何一行相等。由于每一行都以char
\n
结尾,因此字符串永远不会返回
True

更详细地说,虽然“test2\n”
中的“test2”将返回
True
,但这里实际执行的测试是:
“test2”==“test2\n”
,即
False

您可以手动在文件上测试它是如何工作的。对于exmaple,如果我们想查看f
中的“test2”是否应返回
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

然而,如果我们尝试:在f中使用“test2\n”,结果将是
True


结束编辑

打印出数据存储,f。首先,我希望您嵌入了新行字符,以防止项目匹配:“1”与“1\n”不匹配。其次,请注意**打开时“为您提供一个生成器,而不是列表或元组。您不能多次扫描该列表。除非您以某种方式对其进行迭代,否则无法从中获取数据

您需要代码将所有元素放入内存,例如

content = f.read().split("\n")
for item in items:
    if item["ID" in content:

正如其他人所说,
如果f
中的“somestring”将始终失败。
f
是一个文件对象,当您对其进行迭代时,它会生成一行行文本。其中一行或多行可能包含您的文本,因此您可以执行以下操作:

if any("targetstring" in line for line in f):
    # success
f.read()
f.readlines()
方法相比,这是一种节省内存的方法,这两种方法都是在执行任何操作之前将整个文件流式传输到内存中


@彼得伍德在评论中指出,你的一些目标字符串实际上不是字符串。你也应该注意这一点。
all(对于items中的item['ID],str)如果item['ID'],则
应该是
True

在f
中,它不能做你认为它能做的事。另外,字典列表真的是你想要输入的吗?我认为一个简单的列表就可以了,比如[1,“item2]”。还有,第一个
项['ID']
是一个
int
'test2\n'in f
True
请参见。
中的
将使用
iter
,因为
文件
不定义
\uuuuuu包含
,但定义了
\uuuuuuuuu iter\uu
。它将进行迭代,直到全部用完或找到匹配。
iter
将从文件返回一行,因此,
'test2\n'
将匹配,而
'test2'
将不匹配。为了清楚起见,它必须是精确匹配。从链接:
y中的x
是真的,如果某个值
z
x==z
在迭代
y
时生成。哦,这很有趣,我没有意识到。我正要问为什么它不会当“test2\n”
中的“test2”返回
True
时,返回部分匹配,但您刚刚回答了它。谢谢,我将在我的帖子中添加编辑。