python文件列表搜索(我有两个匹配的字符串,但python认为它们并不相等)

python文件列表搜索(我有两个匹配的字符串,但python认为它们并不相等),python,file,list,split,Python,File,List,Split,如果您的输入是john,为什么if语句没有生效 studentname.txt john 34 paul 37 poop 45 以上是studentname.txt中的内容 b=a name = input('students name : ') list1=[] file=open('studentname.txt','r') for (a) in file: list1.append(a) b=a[:-3] 例如,如果输入的名称是“john”,为什么下

如果您的输入是john,为什么if语句没有生效

studentname.txt

john 34
paul 37
poop 45
以上是studentname.txt中的内容

b=a
name = input('students name : ')
list1=[]

file=open('studentname.txt','r')
for (a) in file:
    list1.append(a)    
    b=a[:-3]    
例如,如果输入的名称是“john”,为什么下一个if语句不起作用呢

    if name == b:
        print(a)

file.close

或者,您可以使用.strip[:-3],它将在获取子字符串之前修剪所有空白字符。

您正在拾取换行符。根据创建文件的操作系统,您将有不同的新行字符。摆脱这种状况最安全的方法是:

a = a.rstrip()
这将处理任何尾随空格

你也可以这样做:

for a in map(lambda x: x.rstrip(), file):
另外,不要将变量命名为“file”。这是一个python内置函数,您现在已经为您的脚本和任何导入它的脚本重命名了它

最后,您可能更喜欢这样处理文件:

with open("studentname.txt", 'r') as testfile:
    for item in (line.rstrip() for line in testfile):
        print item
无需关闭文件,with语句控制其作用域并将其关闭。

尝试以下操作:

for a in file.readlines():
    name, _, score = a.strip().partition(' ')
    if name == b:
        print(a)

它更简洁,因为它不依赖于两位数的值,并且比任意索引更具表现力。它还剥离回车符和换行符。

您当前的问题是,正如其他人所提到的,您不知道数据末尾的\n。打印和repr内置功能是您的朋友;使用它们:

if name != b:
    print repr(name), repr(b)
因此,问题的原因变得显而易见

下面是一些未经测试的代码,演示了在处理像您这样的简单数据文件格式时的更好实践。它旨在处理空白/空行、未终止的最后一行和现实生活中的可能性,如:

Jack 9
Jill 100
Billy Bob 99
Decimus 1.23
Numberless
没有撞车或发疯

with open('studentname.txt','rU') as f:
    for line_number, line in enumerate(f, 1):
        line = line.rstrip('\n')
        fields = line.split()
        nf = len(fields]
        if nf == 0: 
            continue: # blank/empty line
        if nf == 1:
            print('Only 1 field in line', line_number, repr(line))
            continue
        dataname = ' '.join(fields[:-1])
        try:
            datanumber = int(fields[-1])
        except ValueError:
            print('Invalid number', repr(fields[-1]), 'in line',
                line_number, repr(line))
            continue
    list1.append((dataname, datanumber))   
    if name == dataname:
        print(repr(dataname), number)

注意file.close的计算结果是一个方法/函数对象,它什么也不做。您需要将其命名为:file.close。但是,现在您正在使用with语句,它将在关闭文件后进行检查,因此只需删除该file.close行。

在studentname.txt中,名称和数字之前也没有打印b,不管它是否真的是您所期望的。此外,您也可以尝试拆分,而不是使用子字符串语法,因为如果有一个不是两位数的数字,则拆分会更可靠。-1文件中的最后一行不一定以\n结尾。[:-4]充其量会将特定于数据的某个字段[:-3]问题与传输机制问题合并在一起,充其量会忽略一个数据字节。另外,a.strip是屠宰性的-请参阅我对另一个答案的评论。您对另一个答案的评论是a.strip是屠宰性的,需要详细说明吗?-11使用阅读行是荒谬的。对于in文件,在不构建所有行的列表的情况下执行相同的操作。脱衣舞就是屠宰。3获得CRs的唯一方法是在Unix上读取Windows文本文件;如果你担心这一点,请使用mode='rU'表示通用换行符。阅读行中的要点很好。不过,我不认为strip有什么问题,这显然取决于具体的应用。通常,对于用户可编辑的文件,我更喜欢去掉所有前导和尾随空格。如果这是一个数据文件,其中前导空格很重要,那么显然这不是一个用于strip的好地方。删除前导和尾随空格,并用单个空格替换空格,对于每个文本字段都是一件好事;这就使得这条线毫无用处。除了line.rstrip'\n'之外,执行其他操作是一个坏习惯。它会删除任何重要的空白,例如制表符。-1使用mode='rU'来克服读取Unixy OSs 2行上Windows创建的文本文件的问题。strip是不安全的/过度使用/删除;行.rstrip'\n'是必需的。@JohnMachin:这么多的反对票对于这样一个简单的问题来说是相当不寻常的,特别是如果反对票的人甚至不想发表自己的答案。谢谢!目前,a=a.rstrip是最容易理解的。我的搜索工作现在开始了。很高兴听到你的消息,格拉托里奥!记住标记最佳答案和快乐编码!不是我最喜欢的,但它是我最后推荐的一个很好的构建块。-1答案和示例列表超出了问题的范围