2011-10-26 12 views
1

如果你的输入是john为什么不是if语句在踢?python文件列表搜索(我有两个匹配的字符串,但python不认为他们是平等的)

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]  

if语句跳闸,如果输入的名称为“约翰”比如为什么不是这个未来?

if name == b: 
     print(a) 

file.close 
+0

也在studentname中。txt在名称和数字前没有### – gratholio

+0

尝试打印'b',无论查看它是否真的如您所愿。此外,您可以尝试使用split,而不是使用子字符串语法,因为那样会更可靠(如果有的数字不是两位数字)。 –

回答

1

您正在选择换行符。根据您创建文件的操作系统,您将拥有不同的新行字符。要摆脱这种自己最安全的方法是:

a = a.rstrip() 

这会照顾任何尾随的空白。

你也可以这样做:

for a in map(lambda x: x.rstrip(), file): 

此外,不命名你的变量 '文件'。这是一个python内置函数,现在您已经为脚本和任何导入脚本的脚本重命名了它。

最后,你可能更喜欢来处理这样的文件:

with open("studentname.txt", 'r') as testfile: 
    for item in (line.rstrip() for line in testfile): 
     print item 

无需关闭文件,with语句来控制它的范围,并将其关闭。

+0

-1(1)使用mode ='rU'来解决在Unixy操作系统上读取Windows创建的文本文件的问题(2)line.strip()是不安全的/矫枉过正/屠宰场; line.rstrip('\ n')是必需的。 –

+0

感谢您的批评。 – marr75

+0

@JohnMachin:对于这样一个简单的问题,特别是如果downvoter甚至不愿意发布他自己的答案,那么很多downvotes在SO中是相当不寻常的。 – heltonbiker

0

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

+0

-1文件中的最后一行不一定以'\ n'结尾。 'a [: - 4]'最好将数据特定的some_field [: - 3]问题与传输机制问题混为一谈,最坏的情况是会省略数据字节。 'a.strip()'也是屠杀 - 请参阅我对另一个答案的评论。 –

+0

你对另一个答案的评论是“'a.strip()'是屠杀”关心一切吗? – ewok

+0

感谢您指出'\ n'问题;-) – ewok

0

试试这个:

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

这是因为它不依赖于一个2位数的值更清洁,比任意指标更具表现力。它也剥夺回车和换行符。

+0

-1(1)使用readlines是荒谬的。 '对于文件'来说,不用建立所有行的列表就可以做同样的事情。 (2)a.strip()是屠杀。 (3)获得CR的唯一方法是通过在Unix上读取Windows文本文件;如果你担心这一点,那么对通用换行符使用mode ='rU'。 –

+0

readlines上的好点。不过,我认为这里没有任何问题,显然取决于具体应用。通常情况下,对于用户可编辑的文件,我宁愿剥去所有前导和尾随空格。如果这是一个数据文件,那里的领先空间很重要,那么显然这不是一个适合脱衣的地方。 –

+0

删除前导&尾部空格,并用单个空格替换空格,对每个TEXT FIELD都是一件好事;这使得line。(| l | r)strip()没用。除line.rstrip('\ n')以外的其他行为是一个不好的习惯。它屠杀任何显着的空白,例如标签。 –

-3

您的直接问题与其他人提到的一样,您在数据末尾并不知道\n。内置功能printrepr是你的朋友;使用它们:

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语句,它将在关闭文件后进行查看,因此只需删除该行即可.行。

+1

-1答案和示例列表超出了问题范围 – marr75

+0

感谢您的示例! – gratholio

相关问题