嗨我有一个大文件,我想删除包含文本ALL的行,并打印没有空格的文件,只剩下剩下的行。我开始了一个程序
sourcefile = open('C:\\scoresfinal.txt', 'r')
filename2 = open('C:\\nohet.txt', 'w')
offending = ["HET"]
def fixup( filename ):
fin = open( filename )
fout = open( filename2 , "w")
for line in fin.readlines():
if True in [item in line for item in offending]:
continue
fout.write(line)
fin.close()
fout.close()
fixup(sourcefile)
但它不起作用。有什么帮助吗?
这是我的错误:
Traceback (most recent call last):
File "C:/Python Make Small File/hetcut2.py", line 18, in <module>
fixup(sourcefile)
File "C:/Python Make Small File/hetcut2.py", line 9, in fixup
fin = open( filename )
TypeError: coercing to Unicode: need string or buffer, file found
答案 0 :(得分:1)
sourcefile = open('C:\\scoresfinal.txt', 'r')
将sourcefile
定义为文件对象。所以
fixup(sourcefile)
将sourcefile
指定为filename
函数中局部变量fixup
的值。
当open(filename)
期望一个字符串命名文件或文件路径时,调用open
会尝试打开一个已经打开的文件对象。
您可以通过这种方式修复代码:
sourcefile = 'C:\\scoresfinal.txt'
filename2 = 'C:\\nohet.txt'
offending = ["HET"]
def fixup( filename ):
with open( filename ) as fin:
with open( filename2 , "w") as fout:
for line in fin:
if any(item in line for item in offending):
continue
fout.write(line)
fixup(sourcefile)
with open(...) as f
语句在Python2.6或更高版本中可用。
在Python2.5中,如果放入
from __future__ import with_statement
这样做的好处是可以保证用Python退出文件句柄退出with
- 块。 (注意,对fin.close()和fout.close()的显式调用已被删除。)
使用with
不是解决您的直接问题所必需的,但它是Python中未来的标准习惯用法,因此您可能习惯它。
答案 1 :(得分:1)
首先,打开文件并将句柄存储在filename2
内。然后在函数中,你试图使用filename2
作为 - well - 文件名,而不是它已经打开的文件的句柄。
如果您希望这样做,则必须将filename2
设置为实际文件名:
filename2 = 'C:\\nohet.txt'
此外,您应该考虑将目标路径名移动到函数参数中,因此它不依赖于某些全局变量。
哦,同样适用于sourcefile
,它也是一个文件句柄,但你的函数也试图用作文件名。
像这样:
def fixup( source, target, badWords ):
fin = open( source )
fout = open( target , "w" )
for line in fin:
if any( ( word in line ) for word in badWords ):
continue
fout.write( line )
fin.close()
fout.close()
offending = ["HET"]
fixup( 'C:\\scoresfinal.txt', 'C:\\nohet.txt', offending )
答案 2 :(得分:0)
2)sourcefile和filename2是文件,而不是字符串。
答案 3 :(得分:0)
问题已经得到解答(你是“打开文件两次”)但我想我应该指出你可以在某种程度上整理代码:
def fixup( filename ):
with fin as open(filename), fout as open(filename2 , "w")
for line in fin:
if not any(word in line for word in offending):
fout.write(line)
此外,您应该考虑使用更好的变量名称。 fixup
,filename
,filename2
(唉!)并不是很有启发性。