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
时,返回部分匹配,但您刚刚回答了它。谢谢,我将在我的帖子中添加编辑。