如何用Python在文本文件中找到字符串第一次出现的位置?

2 投票
5 回答
10792 浏览
提问于 2025-04-16 12:56

我正在尝试在文本文件中搜索某个字符串的第一次出现,并返回该行的所有内容,但我现在的程序却找到了字符串的最后一行并返回了它。

你有什么建议吗?

谢谢!

这是我的代码:

#Open search file as read only
with open(fullpath, 'r') as searchfile:

     #Clear variable names
     partname = partsize = None

     #Search file for strings, trim lines and save as variables
     for line in searchfile:

         if "PART FILE NAME" in line:
             x = line
             partname = x[18:-1]

         if "PART SIZE" in line:
             y = line
             partsize = y[18:-1]
     #Open csv file, write variables, close csv file
     storefile = open("C:/Documents and Settings/Desktop/blue pega3.csv", 'a')
     storefile.write("%s,%s,%s\n" %(partname, partsize, fullpath))
     storefile.close()
     #Close search file
     searchfile.close()         `

5 个回答

1

抱歉来得有点晚,但我觉得这个很酷:

pattern = re.compile(r'search string')
try:
    with open('search file') as inf:
        # Read each line from inf, calling pattern.search(line).
        # ifilter() will keep reading until it gets a match object
        # instead of None. next() will either return the first
        # such match object, or raise StopIteration.
        match = next(itertools.ifilter(None,
                                       (pattern.search(line)
                                        for line in inf)))
except IOError as err:
    # ...
except StopIteration:
    # ...

try/except 让事情有点复杂,但关键是那句 next() 要么返回一个 re.MatchObject,要么抛出一个 StopIteration 的错误。

当然,像任何 MatchObject 一样,我们可以通过 match.string 来获取整个原始行。

7

你的代码返回的是最后匹配的结果,因为你在整个文件中循环,不断地覆盖partnamepartsize的值。你可以只在它们还没有被定义的时候才去覆盖它们:

partname = partsize = None
with open(fullpath, 'r') as searchfile:
    for line in searchfile:
        if partname is None and "PART FILE NAME" in line:
            partname = line[18:-1]
        if partsize is None and "PART SIZE" in line:
            partsize = line[18:-1]
        if partname is not None and partsize is not None:
            break

最后的if语句会在找到这两行后停止继续循环文件,因为那时候就不需要再继续搜索了。

3

最简单的方法就是检查一下 partnamepartsize 这两个变量是否已经有了除了 None 以外的值:

partname = partsize = None

for line in searchfile:

    if partname and partsize:
        break

    if "PART FILE NAME" in line and partname is None:
        x = line
        partname = x[18:-1]

    if "PART SIZE" in line and partsize is None:
        y = line
        partsize = y[18:-1]

撰写回答