当前位置:  开发笔记 > 编程语言 > 正文

在文本文件中找不到字符串

如何解决《在文本文件中找不到字符串》经验,为你挑选了1个好方法。

给定项目编号列表,我试图搜索带有最近项目编号列表的文本文件,并在最近的列表中标识任何项目编号.然后我想添加最近列表中尚未存在的任何项目.

我的代码如下,它似乎没有在文本文件中找到任何内容.为什么不工作?

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

xgord.. 6

问题在于您如何检查指定文本是否存在.在您的代码中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

在上面的代码exerpt中,f.readlines()使用文件对象来读取文件的内容并返回字符串列表,这些字符串是文件中的行.

编辑(相信彼得伍德)

Python会员详细信息

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

案例1: 首先检查是否y__contains__(b)方法.如果是,则返回结果y.__contains__(x).

案例2:但是,如果y确实不能有一个__contains__方法,但确实定义的__iter__方法,巨蟒,而不是使用方法在内容迭代y并返回True如果在任何点中的一个值上迭代的平等x.否则,它返回False.

如果我们使用您的代码作为示例,在某个时刻,它正在检查语句的真实性"test2" in f.这f是一个类型的对象file.(Python文件对象描述).文件对象属于第2种情况(即它们具备__contains__,他们__iter__.

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

详细说明,虽然"test2" in "test2\n"会返回True,但实际执行的测试是:"test2" == "test2\n",即False.

您可以手动测试其在文件中的工作方式.例如,如果我们想看看是否"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.

结束编辑



1> xgord..:

问题在于您如何检查指定文本是否存在.在您的代码中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

在上面的代码exerpt中,f.readlines()使用文件对象来读取文件的内容并返回字符串列表,这些字符串是文件中的行.

编辑(相信彼得伍德)

Python会员详细信息

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

案例1: 首先检查是否y__contains__(b)方法.如果是,则返回结果y.__contains__(x).

案例2:但是,如果y确实不能有一个__contains__方法,但确实定义的__iter__方法,巨蟒,而不是使用方法在内容迭代y并返回True如果在任何点中的一个值上迭代的平等x.否则,它返回False.

如果我们使用您的代码作为示例,在某个时刻,它正在检查语句的真实性"test2" in f.这f是一个类型的对象file.(Python文件对象描述).文件对象属于第2种情况(即它们具备__contains__,他们__iter__.

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

详细说明,虽然"test2" in "test2\n"会返回True,但实际执行的测试是:"test2" == "test2\n",即False.

您可以手动测试其在文件中的工作方式.例如,如果我们想看看是否"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.

结束编辑


请参阅[成员资格测试详细信息](https://docs.python.org/2/reference/expressions.html#membership-test-details).`in`将使用`iter`作为`file`不定义`__contains__`,但确实定义`__iter__`.它将迭代直到它全部用完或直到找到匹配.`iter`将从文件中返回一行,因此`'test2 \n'`将匹配,而`'test2'`则不会.
需要明确的是,它必须完全匹配.从链接:*`y in y`如果在迭代'y`时产生一些带有'x == z`的值'z`,则为真
推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有