Читаете следующую строку текстового файла? - PullRequest
0 голосов
/ 28 августа 2018

Хорошо, я рассмотрел все остальные вопросы, но я не совсем уверен, как применить то, что прочитал, к моему коду, и я не совсем уверен, сработает ли это. Итак, текстовый файл, который у меня есть, выглядит так:

NeQua,High,
ImKol,Moderate,
YoTri,Moderate,
RoDen,High,

и мой код может прочитать первую строку и вырезать разделы, но в тот момент, когда я добавляю поисковый запрос для второй строки, возникает ошибка. Так как мне заставить его прочитать следующую строку?

Это код, который у меня есть:

def main():
    global idin,clientid
    print("===================")
    print("=Activity Recorder=")
    print("===================")
    clientid=input("Please enter the client ID : ")
    print("")
    with open ("clientIntensity.txt") as search:
        for line in search:
            if clientid in line:
                idin=line[6:]#to extract high or moderate from the text
                idin=idin[:-2]
                print ("Intensity = ",idin)
                print("-",idin,"-")
                acti()
                break

            elif clientid not in line:
                search.next()
            else:
                print("Error")
                main()
def acti():
    global idin,clientid
    if idin == "High":
        print("Activites = Running, Swimming, Aerobics, Football, Tennis")
    elif idin == " Moderate ":
        print("Activities = Walking, Hiking, Cleaning, Skateboarding, Basketball")
    else:
        print("error 2")

Я не совсем уверен, как использовать следующую функцию.

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

for цикл уже вызывает next для вас.

Поскольку вы читаете CSV-файл (файл со значениями, разделенными запятыми), вам следует использовать модуль csv - он автоматически разбивает каждую строку за вас, поэтому вам не нужно разбивать каждую строку самостоятельно.

Для дальнейшей помощи я также удалил глобальные переменные и использовал передачу параметров для передачи переменной другой функции. Также я удалил рекурсивный вызов на main() и использовал цикл, чтобы повторить поиск. Если вы введете пустую строку (просто нажмите ввод), она должна выйти из цикла и завершить программу.

import csv

def main():
    print("===================")
    print("=Activity Recorder=")
    print("===================")

    while True:
        clientid=input("Please enter the client ID: ")
        print("")
        if not clientid:
             break
        with open ("clientIntensity.txt") as f:
            search = csv.reader(f, delimiter=',')
            for row in search:
                if row[0] == clientid:
                    idin = row[1]
                    print ("Intensity = ", idin)
                    acti(idin)
                    break
            else:
                print('ERROR: Not found')

def acti(idin):
    if idin == "High":
        print("Activites = Running, Swimming, Aerobics, Football, Tennis")
    elif idin == "Moderate":
        print("Activities = Walking, Hiking, Cleaning, Skateboarding, Basketball")
    else:
        print("ERROR: Unknown idin")
0 голосов
/ 28 августа 2018

Линия:

with open ("clientIntensity.txt") as search:

Создает файл-объект с именем search. Этот файл-объект имеет много методов , но не .next() метод. Следовательно, вызов .next() приводит к ошибке «что вы хотите, чтобы я сделал!?».


Однако вы знаете, что хотите делать, хотите перебирать каждую строку, и вы делаете это с помощью цикла for. Прелесть цикла for состоит в том, что в конце текущей итерации он сам переходит к следующей итерации, пока не будет достигнут конец (на самом деле это конец StopIteration).

Так что, если вы просто хотите перейти к следующей строке, просто дайте циклу for!

with open ("clientIntensity.txt") as search:
    for line in search:
        if clientid in line:
            idin=line[6:]#to extract high or moderate from the text
            idin=idin[:-2]
            print ("Intensity = ",idin)
            print("-",idin,"-")
            acti()
            break

Один последний совет. Если у вас есть строка, такая как hello,there,, вам потребуется много усилий для извлечения there путем нарезки, как вы, но это очень легко сделать, используя метод объекта string, а именно .split(). Это позволяет получить список подстрок, указав разделитель. Например, 'hello,there,'.split(',') дает ['hello', 'there', '']. Затем вы можете просто индексировать второе слово с помощью 'hello,there,'.split(',')[1], давая 'there'!

ПРИМЕЧАНИЕ. Причина, по которой третий метод возвращается из метода split, заключается в том, что строка заканчивается запятой, поэтому при разделении на запятую также возвращается пустая строка в конце, но вы можете игнорировать это .

0 голосов
/ 28 августа 2018

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

elif clientid not in line:
    pass

Не имеет отношения к чтению файла: вы if-elseif-else не имеет смысла. clientid in line имеет значение true или false, поэтому не имеет смысла иметь 3 условия. Просто уберите середину elif в целом`

...