【问题标题】:Reading data from a text file in Python according to the parameters provided根据提供的参数在 Python 中从文本文件中读取数据
【发布时间】:2018-02-01 13:51:50
【问题描述】:

我有一个类似这样的文本文件

Mqtt_allowed=true
Mqtt_host=192.168.0.1
Mqtt_port=2223
<=============>
cloud_allowed=true
cloud_host=m12.abc.com
cloud_port=1232
<=============>
local_storage=true
local_path=abcd

我需要获取用户提供的每个值 w.r.t 参数。 我现在正在做的是:

def search(param):
    try:
        with open('config.txt') as configuration:
            for line in configuration:
                if not line:
                    continue    
                function, f_input=line.split("=")
                if function == param:
                    result=f_input.split()
                    break
                else:
                    result="0"
    except FileNotFoundError:
        print("File not found: ")
    return result

mqttIsAllowed=search("Mqtt_allowed")
print mqttIsAllowed

现在,当我只调用 mqt 的东西时,它工作正常,但是当我在“”分离之后调用云或任何东西时,它会引发错误。谢谢

【问题讨论】:

  • 请发布您遇到的错误的回溯。
  • 您使用该符号字符串进行分隔是否有原因?为什么需要分开?空行也不够好吗?
  • 原因是......我正在为非编码人员制作一个文本文件来编写凭据,而该符号只是让他们在文本文件中清晰和分离
  • 也许不是很重要,但你遇到了什么错误?
  • 错误为 NameError:未定义全局名称“FileNotFoundError”。但现在通过下面 ForceBru 给出的解决方案可以正常工作..

标签: python split file-read


【解决方案1】:

跳过所有以&lt;开头的行:

if not line or line.lstrip().startswith("<"):
    continue

或者,如果您真的非常想完全匹配分隔符:

if line.strip() == "<=============>":
    continue

我认为第一个变体更好,因为如果有人不小心稍微修改了分隔符,第二段代码将根本不起作用。

【讨论】:

  • 我个人认为最好向 OP 解释他们做错了什么(即使他们没有发布错误),因为他们对解包语法有误解。
  • @pstatix, ...或者他们只是忘记了 line.split("=") 也会影响分隔符,而分隔符恰好由 =s 组成。
  • 即便如此,如果用户想要更改分隔符开始字符怎么办?或者制作一个以'&lt;' 开头的密钥,例如'&lt;usr_grp&gt;'。最好使用字符排序的标准文件格式。
  • @pstatix,如果他们想改变“某事”怎么办?他们可能不得不修改他们的代码以正确处理更改,因为代码旨在处理这种特定格式,并且该格式已创建为由该确切代码解析。除非他们试图实现 INI 格式,但现在这看起来有点矫枉过正。
【解决方案2】:

因为您试图以似乎是 standard INI format 的样式拆分 = 字符,所以可以安全地假设您的配对最大尺寸为 2。我不喜欢使用方法依赖于字符检查(除非特别要求),所以试一试:

def search(param):
    result = '0' # declare here
    try:
        with open('config.txt') as configuration:
            for line in configuration:
                if not line:
                    continue  

                f_pair = line.strip().split("=") # remove \r\n, \n

                if len(f_pair) > 2: # your separator will be much longer
                    continue
                else if f_pair[0] == param:
                    result = f_pair[1]
                    # result = f_input.split() # why the 'split()' here?
                    break

    except FileNotFoundError:
        print("File not found: ")

    return result

mqttIsAllowed=search("Mqtt_allowed")

我很确定您遇到的错误是 ValueError: too many values to unpack

我是这样知道的:

当您为任何Mqtt_* 值调用此函数时,循环从不 遇到分隔符字符串&lt;=============&gt;。只要您尝试调用第一个分隔符下方的任何内容(例如 cloud_* 键),循环最终会到达第一个分隔符并尝试执行:

function, f_input = line.split('=')

但这不起作用,实际上它会告诉你:

ValueError: too many values to unpack (expected 2)

那是因为您强制 split() 调用仅推入 2 个变量,但分隔符字符串上的 split('=') 将返回 15 个元素的列表('&lt;''&gt;' 和 13 '')。因此,执行我在上面发布的操作可确保您的 split('=') 仍然关闭,但会检查您是否点击了分隔符。

【讨论】:

  • line.split("=").strip() 不起作用,因为str.split 返回一个没有strip 方法的列表。
  • 好的,谢谢 pstatix,但是如何获取单独的值,现在我正在获取所有文本文件,我想分别拥有函数和 f_input..
  • @HassanHaroon 对不起,也错过了那部分。还是有点昏昏沉沉...需要更多的咖啡。请参阅我的更新列表索引。
  • @HassanHaroon 你是什么意思你得到所有的文本文件?
  • 我的意思是只为分割和剥离函数定义了行,没有函数和f_input
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 2020-07-01
  • 1970-01-01
  • 2013-03-13
相关资源
最近更新 更多