根据提供的参数从Python中的文本文件中读取数据
Reading data from a text file in Python according to the parameters provided
我有一个类似这样的文本文件
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 东西时它工作正常但是当我在“<==========>”分隔之后调用云或任何东西时它会抛出错误。谢谢
跳过所有以<
开头的行:
if not line or line.lstrip().startswith("<"):
continue
或者,如果您真的非常想精确匹配分隔符:
if line.strip() == "<=============>":
continue
我认为第一个变体更好,因为如果有人不小心稍微修改了分隔符,第二段代码将根本无法工作。
因为您正试图以 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_*
值调用此函数时,循环 永远不会 遇到分隔符字符串 <=============>
。一旦您尝试调用第一个分隔符下方的任何内容(例如 cloud_*
键),循环最终会到达第一个分隔符并尝试执行:
function, f_input = line.split('=')
但这行不通,事实上它会告诉你:
ValueError: too many values to unpack (expected 2)
那是因为您强制 split()
调用仅推入 2 个变量,但是分隔符字符串上的 split('=')
将 return 包含 15 个元素的列表(a '<'
、一个 '>'
和 13 个 ''
)。因此,执行我在上面发布的操作可确保您的 split('=')
仍然关闭,但会检查您是否点击了分隔符。
我有一个类似这样的文本文件
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 东西时它工作正常但是当我在“<==========>”分隔之后调用云或任何东西时它会抛出错误。谢谢
跳过所有以<
开头的行:
if not line or line.lstrip().startswith("<"):
continue
或者,如果您真的非常想精确匹配分隔符:
if line.strip() == "<=============>":
continue
我认为第一个变体更好,因为如果有人不小心稍微修改了分隔符,第二段代码将根本无法工作。
因为您正试图以 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_*
值调用此函数时,循环 永远不会 遇到分隔符字符串 <=============>
。一旦您尝试调用第一个分隔符下方的任何内容(例如 cloud_*
键),循环最终会到达第一个分隔符并尝试执行:
function, f_input = line.split('=')
但这行不通,事实上它会告诉你:
ValueError: too many values to unpack (expected 2)
那是因为您强制 split()
调用仅推入 2 个变量,但是分隔符字符串上的 split('=')
将 return 包含 15 个元素的列表(a '<'
、一个 '>'
和 13 个 ''
)。因此,执行我在上面发布的操作可确保您的 split('=')
仍然关闭,但会检查您是否点击了分隔符。