我正在尝试使用str.find()并且它不断引发错误,我做错了什么?
import codecs
def countLOC(inFile):
""" Receives a file and then returns the amount
of actual lines of code by not counting commented
or blank lines """
LOC = 0
for line in inFile:
if line.isspace():
continue
comment = line.find('#')
if comment > 0:
for letter in range(comment):
if not letter.whitespace:
LOC += 1
break
return LOC
if __name__ == "__main__":
while True:
file_loc = input("Enter the file name: ").strip()
try:
source = codecs.open(file_loc)
except:
print ("**Invalid filename**")
else:
break
LOC_count = countLOC(source)
print ("\nThere were {0} lines of code in {1}".format(LOC_count,source.name))
错误
File "C:\Users\Justen-san\Documents\Eclipse Workspace\countLOC\src\root\nested\linesOfCode.py", line 12, in countLOC
comment = line.find('#')
TypeError: expected an object with the buffer interface
答案 0 :(得分:2)
使用内置函数open()
代替codecs.open()
。
您违反了非Unicode(Python 3 bytes
,Python 2 str
)和Unicode(Python 3 str
,Python 2 unicode
之间的区别)字符串类型。 Python 3不会像Python 2那样在非Unicode和Unicode之间自动转换。使用不带encoding
参数的codecs.open()会返回一个对象,当您从中读取它时会产生bytes
。
此外,您的countLOC
功能无效:
for letter in range(comment):
if not letter.whitespace:
LOC += 1
break
for循环将遍历从0到1的数字,小于字符串'#'
中letter = 0, 1, 2...
的位置; whitespace
不是整数的方法,即使它是,你也不是在调用它。
此外,如果该行不包含#
,则永远不会递增LOC。
countLOC
的“固定”但其他忠实(且效率低下)的版本:
def countLOC(inFile):
LOC = 0
for line in inFile:
if line.isspace():
continue
comment = line.find('#')
if comment > 0:
for letter in line[:comment]:
if not letter.isspace():
LOC += 1
break
else:
LOC += 1
return LOC
我怎么写这个函数:
def count_LOC(in_file):
loc = 0
for line in in_file:
line = line.lstrip()
if len(line) > 0 and not line.startswith('#'):
loc += 1
return loc
答案 1 :(得分:1)
你实际上是否将一个打开的文件传递给该函数?也许尝试打印类型(文件)和类型(行),因为这里有一些可疑的东西 - 打开文件作为参数,我只是无法重现你的问题! (您的代码中还有其他错误,但不会导致该异常)。哦顺便说一句,作为最佳做法,不要为了你自己的目的使用内置词的名称,例如file
- 这会引起令人难以置信的混乱!