如何在 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))
我有一个问题要解决。在 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))