如何在 python 中将文件名作为函数参数传递?

how to pass a filename as function parameter in python?

我有一个问题要解决。在 python 中编写一个函数,它将一个文件名 fname 和一个字符串 s 作为输入。它将 return s 是否出现在文件内部。有可能是文件特别大,一下子读不进内存 我已经为此做了一个解决方案

import fileinput
def FileAndString(s,filename):
    
    inname =input(filename)
    s =s
    fname= open(fileinput.input(files ='inname'))
    flag = 0
    index = 0
    for line in fname:
        index += 1
        if s in line:
            flag = 1
            break
    if flag == 0:
        print("string", s, "not found")
    else:
        print('String', s, 'Found In Line', index)
FileAndString('goal','fname.txt')

我收到这样的错误

  traceback (most recent call last):
  File "c:/Users/hp/Desktop/test/repo/file.py", line 19, in <module>
  File "c:/Users/hp/Desktop/test/repo/file.py", line 10, in FileAndString
    index += 1
  File "C:\Users\hp\AppData\Local\Programs\Python\Python38\lib\fileinput.py", line 248, in __next__
    line = self._readline()
  File "C:\Users\hp\AppData\Local\Programs\Python\Python38\lib\fileinput.py", line 366, in _readline
    self._file = open(self._filename, self._mode)
FileNotFoundError: [Errno 2] No such file or directory: 'inname'

我的问题是: 这是正确的方法吗? 如何将 fname.txt 或任何文件作为参数传递

这一行:

fname= open(fileinput.input(files ='inname'))

您已将 'inname' 指定为字符串而不是变量。删除引号,它将解决您当前的错误。

更改此行: fname= open(fileinput.input(files ='inname'))

收件人: fname= open(fileinput.input(files = inname))

您将 inname 作为字符串传递。这就是系统找不到任何目录的原因。只需取消引用您的变量即可。

正如其他人已经回答的那样,您的代码遇到的问题是您没有打开提供函数的文件。您正在尝试打开变量的字符串表示形式,而不是实际变量。

这是您想要的解决方案:

def string_in_file(fname, s):
    # Use a context-manager to automatically
    # handle closing of files after you're done.
    with open(fname, "r") as F:
        # Read one line at a time, keeping only
        # that one line in memory.
        for line in F.readlines():
            if s in line:
                return True
        # If none of the lines in the for-loop
        # are True, then the string is not in the file.
        return False

或者,如果您想要单行解决方案(其工作方式不同,但结果相似):

string_in_file = lambda fname, s: any(s in line for line in open(fname))