python不读取文件的第二行

时间:2019-03-20 05:35:15

标签: python

我有一个包含以下内容的文本文件

url1,user1,xxxxxxxxx
url2,user2,yyyyyyyyy

我有一段代码应该根据传递的xxxxxxxxx值(yyyyyyyyyenv)获得值prodtest

#!/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

现在,当传递的envprod时,该函数起作用,但当值为test且执行else部分时,列表res的值仅xxxxxx,列表中只有一个值,并且代码self.api = res[1]失败。 print(res)仅打印['xxxxxxxxxxxx\n'],但是当url通过url1print(res)仅打印['xxxxxxxxxxx \ n','yyyyyyyyyy \ n']

我的代码有什么问题?

2 个答案:

答案 0 :(得分:1)

由于很难调试已经过多的代码,因此以下是一个简短的代码段:

使用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

答案 1 :(得分:1)

代码的问题是,您用line_api = line.split(',')[2]拆分了每一行,并且[2]引用了该列表中存在的第三个元素xxxxxxxxx或{ {1}},然后在调用yyyyyyyyy时引用该列表中的第一个(也是唯一的)元素。

self.api = res[0]将始终抛出错误,因为它永远不会出现在1元素列表中。我不确定此else语句的目标是什么,但我建议使用DirtyBit的优雅解决方案