尝试读取文件并从行创建字典,skippipng行以#符号
开头文件示例:
param1=val1
# here is comment
我的功能:
def readFromFile(name):
config = {}
with open(name, "r") as f:
for line in f.readlines():
li=line.lstrip()
if not li.startswith("#"):
config[line.split('=')[0]] = line.split('=')[1].strip()
return config
我得到列表索引超出范围错误
但是! 如果我尝试跳过行开头,例如符号“h” - 函数效果很好......
答案 0 :(得分:5)
尝试:
def readFromFile(name):
config = {}
with open(name, "r") as f:
for line in f.readlines():
li = line.lstrip()
if not li.startswith("#") and '=' in li:
key, value = line.split('=', 1)
config[key] = value.strip()
return config
你可能有一个空行会破坏你的分裂()
答案 1 :(得分:4)
您的代码工作得很好,除了既不以#
开头也不包含=
字符的行。通常,这些都是空行。
在拆分前测试=
字符:
def readFromFile(name):
config = {}
with open(name, "r") as f:
for line in f.readlines():
li=line.lstrip()
if not li.startswith("#") and '=' in li:
config[line.split('=')[0]] = line.split('=')[1].strip()
return config
您可以简化代码并使其成为字典理解:
def readFromFile(name):
with open(name, "r") as f:
return {k: v
for line in f
for (k, v) in (line.strip().split('=', 1),)
if '=' in line.strip() and line[:1] != '#'}
您可以直接遍历f
(文件对象) ;首先不需要使用f.readlines()
将所有行读入内存。我使用.split('=', 1)
仅在等号上拆分。
答案 2 :(得分:1)
您可以直接返回字典:
def readFromFile(name):
with open(name) as f:
return { line.split('=')[0]:line.split('=')[1].strip() for line in f \
if not line.startswith('#' and '=' in line }