Функция печатает значение, но возвращает «Нет» - PullRequest
0 голосов
/ 26 сентября 2019
def findLineParam(sprotParam, pos):

    if line[:2] == sprotParam:
        start = pos
        while line[start] == " ":
            start += 1
        stop = start + 1 
        while stop < len(line) and not line[stop] in (" ", ";"):
            stop += 1
        print(line[start:stop]) # prints the correct value!
        return line[start:stop] # returns None? 

Чтобы кратко объяснить функцию кода, это то, что он должен взять входную строку (ключевое слово), например, «ID», и найти это в строке в текстовом файле, тогда он должен найти первое значение после пробела.чтение следующего "" или ";"и верни это.Я вижу, что когда я печатаю строку, она возвращает именно то, что я хочу, но когда я ее возвращаю, она возвращает «Нет».

Всякий раз, когда я заменяю «sprotParam» на список ввода вместо (* sprotParam), он возвращает значения, но также равное количество «None», соответствующее строкам в файле, что, как я считаю, указывает на то, чтоон выполняет итерации и выполняет операции со всеми строками, чего не следует делать.

Код, вызывающий функцию

try:
    file = input("Enter filename: ")
except IOError as e:
    print("That is not a recognised filename. Error given: " + str(e)) 
    sys.exit(1) # Close the program

with open(file, 'r') as infile:
    for line in infile:
        ident = findLineParam("ID", 2)

Ответы [ 3 ]

1 голос
/ 26 сентября 2019

line не входит в область действия функции, поэтому вам необходимо передать ее функции в качестве аргумента:

def findLineParam(sprotParam, pos, line):
    if line[:2] == sprotParam:
        start = pos
        while line[start] == " ":
            start += 1
        stop = start + 1 
        while stop < len(line) and not line[stop] in (" ", ";"):
            stop += 1
        print(line[start:stop]) # prints the correct value!
        return line[start:stop] # returns None? 

with open(file, 'r') as infile:
    for line in infile:
        ident = findLineParam("ID", 2, line)

Обновить

Вот упрощенная версия вашегокод:

def findLineParam(sprotParam, file):
    for line in file.split(sprotParam):#split by parameter
        if line != '<':
            for item in line.split(): #split by whitespace
                if item != '=':
                    print(item)
                    return item

    raise Exception(f'No {sprotParam} parameters were found in the given file')

file = 'test.txt'
with open(file, 'r') as f:
    ident = findLineParam("ID", f.read())

Теперь, если вы запустите это для test.txt:

<ID= 'foo'    > <div></div>
asdfnewnaf

Будет возвращено 'foo'.

0 голосов
/ 26 сентября 2019

Как @NoxFly предположил, что все пути не возвращаются.

def findLineParam(sprotParam, pos, line):
    ret = ''
    if line[:2] == sprotParam:
        start = pos
        while line[start] == " ":
            start += 1
        stop = start + 1 
        while stop < len(line) and not line[stop] in (" ", ";"):
            stop += 1
        print(line[start:stop]) # prints the correct value!
        ret = line[start:stop] # returns None? 
   return ret

with open(file, 'r') as infile:
    for line in infile:
        ident = findLineParam("ID", 2, line)

Гораздо лучшим подходом будет использование регулярных выражений вместо циклов while.например, регулярное выражение найдет значение.

r"ID:([^(\s|;)]*)"
0 голосов
/ 26 сентября 2019

если ваша функция должна что-то возвращать, вы должны вернуть значение по умолчанию (вы возвращаете только оператор if, поэтому, если вы не сопоставляете это с if, вы возвращаете None), я знаю, что это не решит вашу проблему, но лучшечтобы получить это ^^

...