我是python的初学者,所以如果代码看起来很糟糕我会道歉。在赋值中,我必须编写一个包含2个参数的函数。第一个参数,输入读取文件,第二个参数是输出文件。对于输入文件中的每一行,该函数应在输出文件上写入多次出现的单词。
def repeat(fileIn, fileOut):
fileIn(open(fileIn, 'r')
fileOut(open(fileOut,'w')
content = fileIn.read()
for word in fileIn:
if word in content:
outF.write()
return content
当我执行该函数时,没有任何反应或者它返回了语法错误
答案 0 :(得分:2)
def repeat(fileIn, fileOut):
fileIn = open(fileIn, 'r')
fileOut = open(fileOut,'w')
content = fileIn.read()
for word in content.split(' '):
if content.count(word) > 1:
fileOut.write()
return content
你没有在=
和fileIn
之间使用open
,我不知道你为什么不这样做.. typ-o?
open
会返回一个文件句柄,您可以对其进行操作,例如read
..要将此句柄放入变量,请使用=
,而不是fileIn(open(...))
。
其次,您没有将content
拆分为单词,通过将变量重命名为for word in content:
可以更准确地描述for character in content:
,因为您所做的是循环每个字符对字符串执行for
操作时的字符串。必须使用split
将字符串分成如下列表:["this", "was", "once", "a", "string"]
第三,您尝试outF.write
,outF
从未定义..您称之为fileOut
..
此外,尝试重写它以更好地匹配最佳实践(这是针对这种特殊情况而做的,在这种情况下,您忘记关闭文件,让您使用打开的文件句柄):
def repeat(fileIn, fileOut):
with open(fileOut, 'w') as fileOut: # Normally, you don't reuse variable names like this..
with open(fileIn, 'r') as fileIn:
content = fileIn.read()
for word in content.split(' '):
if content.count(word) > 1:
fileOut.write()
return content
但请注意,这将为您留下两次写入新输出文件的单词,因为当您循环计算出现的每个单词时,下次碰到单词时,它会再次写入,而您已经计算过它
考虑到这个字符串:“我拿了一些需要做的事情”,首先你找到了 ,然后把它写到输出文件中。 。接着又来了,你又把它写到了输出文件中。为此,您需要以某种方式存储“已知单词”,这样做的简单方法是:
def repeat(fileIn, fileOut):
knownWords = []
with open(fileOut, 'w') as fileOut: # Normally, you don't reuse variable names like this..
with open(fileIn, 'r') as fileIn:
content = fileIn.read()
for word in content.split(' '):
if not word.lower() in knownWords and content.count(word) > 1:
fileOut.write()
knownWords.append(word.lower())
return content
或者您可以将输出延迟到新文件,这在某些需要“实时”写入新文件的scnearios中可能会有风险,有点像流...但在这种情况下我不会看到有什么害处:
def repeat(fileIn, fileOut):
outputData = ''
with open(fileIn, 'r') as fileIn:
content = fileIn.read()
for word in content.split(' '):
if not word in outputData and content.count(word) > 1:
outputData += word + ' '
with open(fileOut, 'w') as fileOut:
fileOut.write(outputData[:-1])
return content