python не читает вторую строку файла

#python

#python

Вопрос:

у меня есть текстовый файл с приведенным ниже содержимым

 url1,user1,xxxxxxxxx
url2,user2,yyyyyyyyy
  

У меня есть блок кода, который должен получить значение xxxxxxxxx или yyyyyyyyy на основе переданного env значения ( prod or test )

 #!/usr/bin/python
import os

class test:
    def __init__(self, env):
        self.env = env

    def func(self):
        res = []
        try:
            if os.path.exists("file.txt"):
                    try:
                        with open("file.txt", 'r') as fp:
                            for line in fp:
                                print("line is "  line)
                                line_api = line.split(',')[2]
                                print(line_api)
                                res.append(line_api)
                                print(res)
                                if self.env == "prod":
                                    self.api = res[0]
                                    print(self.api)
                                else:
                                    self.api = res[1]
                                    print(self.api)
                    except Exception as e:
                        print(e)
        except Exception as e:
            print(e)
  

значение при выполнении else части

 list index out of range
  

Теперь, когда env передано значение prod , функция работает, но когда значение равно test и else часть выполнена, значение списка res равно только xxxxxx , в списке есть только одно значение, и код self.api = res[1] завершается с ошибкой. print(res) только отпечатки ['xxxxxxxxxxxxn'] , но когда url прошло это url1 print(res) только принты как [‘xxxxxxxxxxxп’, ‘yyyyyyyyy п’]

Что не так с моим кодом?

Комментарии:

1. Итак, цель состоит в том, чтобы найти соответствующее значение URL?

2. @DirtyBit цель состоит в том, чтобы найти api значение ..т.е. 3-е значение столбца в текстовом файле, значение должно быть 1-м значением столбца (xx), если url1 и 2-м значением столбца (yyy), если передается url2

3. Понял и уже опубликовал ответ, посмотрим, поможет ли это?

4. @DirtyBit я отредактировал свой код, чтобы он был более понятным

5. Обновление: проблема заключалась в проверке условия if, if должно быть вне цикла for.

Ответ №1:

Проблема с вашим кодом заключается в том, что вы разделяете каждую строку, в которой вы читаете, на line_api = line.split(',')[2] и [2] ссылается третий элемент, существующий в этом списке, который является xxxxxxxxx or yyyyyyyyy , затем при вызове self.api = res[0] вы ссылаетесь на первый (и единственный) элемент в этом списке.

self.api = res[1] всегда выдает ошибку, потому что она никогда не будет существовать в списке элементов 1. Я не уверен, какова была цель этого оператора else, но я бы предложил использовать элегантное решение DirtyBit

Ответ №2:

Поскольку сложно отлаживать ваш и без того избыточный код, вот более короткий фрагмент:

Используя startswith() :

list.txt:

 url1,user1,xxxxxxxxx
url2,user2,yyyyyyyyy
  

Следовательно:

 logFile = "list.txt"    

def getUrlValue(url):
    with open(logFile) as f:
        content = f.readlines()

    # you may also want to remove empty lines
    content = [l.strip() for l in content if l.strip()]    

    for line in content:
        if line.startswith(url):
            print(line.split(',')[2])

getUrlValue("url1")
getUrlValue("url2")
  

ВЫВОД:

 xxxxxxxxx
yyyyyyyyy