python文件列表搜索(我有两个匹配的字符串,但python认为它们并不相等)
如果您的输入是john,为什么if语句没有生效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”,为什么下
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答案和示例列表超出了问题的范围