`if file.find('freq-') != -1`这句话是什么意思?

3

我是一名化学专业的学生,希望编写一个脚本来从高斯输出文件中提取一些数据(例如偶合常数和相互质子距离)。

我找到了一个从高斯输出文件中提取化学位移的脚本。然而,我不理解脚本中的 if file.find('freq-') !=-1 是什么意思。

以下是部分脚本(由于该脚本还会执行其他操作,所以我只展示了与我的问题相关的部分):

def read_gaussian_freq_outfiles(list_of_files):
    list_of_freq_outfiles = []
    for file in list_of_files:
        if file.find('freq-') !=-1:
            list_of_freq_outfiles.append([file,int(get_conf_number(file)),open(file,"r").readlines()])

    return list_of_freq_outfiles

def read_gaussian_outputfiles():
    list_of_files = []
    for file in glob.glob('*.out'):
        list_of_files.append(file)
    return list_of_files

我认为在def read_gaussian_outputfiles()部分,我们创建了一个文件列表,并简单地将所有扩展名为".out"的文件添加到列表中。

read_gaussian_freq_outfiles(list_of_files)部分可能会列出文件名中包含"freq-"的文件。但是file.find('freq-')!=-1是什么意思呢?

它是否意味着如果我们在文件名中找到的内容不等于-1,或者其他什么意思?

一些其他附加信息:高斯输出文件名的格式为:xxxx-opt_freq-conf-yyyy.out 其中xxxx是您分子的名称,yyyy是一个数字。


2
你是否尝试过这个文档 - erip
是的,我确实阅读了这个页面,但当我阅读它时,我并没有完全理解其中的内容。我是Python的新手(我开始学习的原因是要编写一个脚本来提取我想要提取的任何内容,正如我在帖子中提到的那样)......所以我仍然在努力理解您提供的文档中的解释。再次阅读文档并结合您提供的示例使事情变得更加清晰!非常感谢您的帮助! - SiSi
3个回答

2

正如其他答案所示:如果.find()返回-1,则无法找到您要查找的内容。这是因为.find将返回它可以找到查询的第一个索引。因此,在以下句子中:

The cat is on the mat

如果使用语句 sentence.find('cat'),它将返回 4(因为 'cat' 在索引 4 开始(索引从 0 开始!))。

然而,如果使用 sentence.find('dog'),则会返回它能返回的唯一结果:-1。如果它返回 0 作为“未找到”,则可能会认为查询从索引 0 开始。通过 -1,您知道它找不到。


1
啊哈!这就是为什么它返回-1而不是0的原因^^ - SiSi
很好的解释。 - James

2
s.find(foo)s 中没有找到 foo 时,它会返回 -1。因此,当 s.find(foo) 没有返回 -1 时,我们知道它没有失败。 read_gaussian_freq_outfiles 查找 list_of_files 中每个文件名中的术语 "freq-"。如果成功在文件名中找到这个短语,它就会将一个包含该文件、一个“conf编号”(不确定是什么)和文件内容的列表添加到名为 list_of_freq_outfiles 的列表中。
我创建了三个文件:goodbye.txthello.txthelloworld.txt,以演示用法。
在此示例中,我将打印所有以 .txt 结尾的文件,创建一个文件列表,然后打印所有文件名中带有短语 "goodbye" 的文件。这应该只打印出 goodbye.txt
09:53 $ ls
goodbye.txt    hello.txt      helloworld.txt
(venv) ✔ ~/Desktop/ex 
09:53 $ python
Python 2.7.11 (default, Dec  5 2015, 14:44:47) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.1.76)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import glob
>>> for file in glob.glob('*.txt'):
...   print(file)
... 
goodbye.txt
hello.txt
helloworld.txt
>>> list_of_files = [ file for file in glob.glob('*.txt') ]
>>> print(list_of_files)
['goodbye.txt', 'hello.txt', 'helloworld.txt']
>>> for file in list_of_files:
...   if file.find('goodbye') != -1:
...     print(file)
... 
goodbye.txt

实际上,只有goodbye.txt这个文件被打印出来。


1

这里正在寻找所有文件名中包含'freq-'子字符串的文件。从技术上讲,它是在寻找文件名中有'freq-'的文件。 - erip
那就是我想说的,已经做出了修改。谢谢。 - Yuvraj Singh
阅读了Nander Speerstra的评论后,我完全理解了您发布的示例的输出结果。在前两种情况下,它返回15,因为您可以从索引15开始找到字符串“exam”。而在第三种情况下,您无法找到它,因为您从索引40(我想是这样吧?)开始搜索。 - SiSi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接