Возникли проблемы с str.find () - PullRequest
1 голос
/ 26 мая 2009

Я пытаюсь использовать 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))

Error

  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

Ответы [ 2 ]

2 голосов
/ 26 мая 2009

Используйте встроенную функцию open() вместо codecs.open().

Вы столкнулись с разницей между строковыми типами не-Unicode (Python 3 bytes, Python 2 str) и Unicode (Python 3 str, Python 2 unicode). Python 3 не будет автоматически конвертировать между не-Unicode и Unicode, как это делает Python 2. Использование codecs.open () без параметра encoding возвращает объект, который выдает bytes при чтении из него.

Кроме того, ваша countLOC функция не будет работать:

for letter in range(comment):
    if not letter.whitespace:
        LOC += 1
        break            

То, что цикл for будет перебирать числа от нуля до единицы меньше, чем позиция '#' в строке (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 голос
/ 26 мая 2009

Вы действительно передаете открытый файл в функцию? Возможно, попробуйте напечатать тип (файл) и тип (строку), поскольку здесь есть что-то подозрительное - с открытым файлом в качестве аргумента, я просто не могу воспроизвести вашу проблему! (В вашем коде есть другие ошибки, но ни одна из них не привела бы к такому исключению). О, кстати, в качестве лучшей практики, НЕ используйте имена встроенных объектов, таких как file, для своих собственных целей - это вызывает невероятную путаницу!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...