Python 从文件中读取并将内容转换为字典

Python 从文件中读取并将内容转换为字典,python,Python,我有一个文本文件,其内容如下: State Texas Austin Houston Dallas State Florida Orlando Miami Jacksonville Naples ! State California San Diego Los Angeles San Francisco 目标:我想从这个文本文件中读取并将它们转换成字典,应该如下所示- state_dict = { 'Texas': ['Austin', 'Houston', 'Dallas'],

我有一个文本文件,其内容如下:

State Texas
Austin
 Houston
 Dallas
State Florida
Orlando
Miami
Jacksonville
Naples
!
State California
San Diego
Los Angeles
San Francisco
目标:我想从这个文本文件中读取并将它们转换成字典,应该如下所示-

state_dict = {
    'Texas': ['Austin', 'Houston', 'Dallas'], 
    'Florida': ['Orlando', 'Miami', 'Jacksonville', 'Naples'], 
    'California': ['San Diego', 'Los Angeles', 'San Francisco']
}
到目前为止,我的代码是:

State_Dict = {}
with open('state.txt', 'r') as main_fd:

for mystate in main_fd:
    mystate = mystate.lstrip()

    if ("State" in mystate):
        state_key = "_".join(mystate.split()[1:])
        State_Dict[state_key] = []

        for cities in main_fd:
            if ("!" in cities):
                break

            else:
                State_Dict[state_key].append(cities.rstrip())

print(State_Dict)
但结果是:

{
'Texas': [
    ' Austin', ' Houston', ' Dallas', 
    'State Florida', ' Orlando', ' Miami', 
    ' Jacksonville', ' Naples'
    ], 
'California': [
    ' San Diego', ' Los Angeles', ' San Francisco'
    ]
}

我该如何解决这个问题

代码中的问题是,当出现“!”时,您正在停止查找某个州的城市,但城市的新部分也由以“state”开头的行表示。 另一个错误是,您每次从一开始就迭代城市,而不是当前所在的州

State_Dict = {}
main_fd = '''\
State Texas
Austin
Houston
Dallas
State Florida
Orlando
Miami
Jacksonville
Naples
!
State California
San Diego
Los Angeles
San Francisco\
'''.splitlines()

for idx, mystate in enumerate(main_fd):
    if "State" in mystate:
        state_key = "_".join(mystate.split()[1:])
        State_Dict[state_key] = []

        for cities in main_fd[idx+1:]:
            if '!' in cities or "State" in cities:
                break

            else:
                State_Dict[state_key].append(cities.rstrip())

print(State_Dict)
输出:

{'Florida': ['Orlando', 'Miami', 'Jacksonville', 'Naples'], 
'California': ['San Diego', 'Los Angeles', 'San Francisco'], 
'Texas': ['Austin', 'Houston', 'Dallas']}

代码的问题是,当出现“!”时,您正在停止查找某个州的城市,但城市的新部分也由以“state”开头的行表示。 另一个错误是,您每次从一开始就迭代城市,而不是当前所在的州

State_Dict = {}
main_fd = '''\
State Texas
Austin
Houston
Dallas
State Florida
Orlando
Miami
Jacksonville
Naples
!
State California
San Diego
Los Angeles
San Francisco\
'''.splitlines()

for idx, mystate in enumerate(main_fd):
    if "State" in mystate:
        state_key = "_".join(mystate.split()[1:])
        State_Dict[state_key] = []

        for cities in main_fd[idx+1:]:
            if '!' in cities or "State" in cities:
                break

            else:
                State_Dict[state_key].append(cities.rstrip())

print(State_Dict)
输出:

{'Florida': ['Orlando', 'Miami', 'Jacksonville', 'Naples'], 
'California': ['San Diego', 'Los Angeles', 'San Francisco'], 
'Texas': ['Austin', 'Houston', 'Dallas']}

你要找的是这样的东西。 考虑一次循环遍历一行,并为您的条件建立一系列检查。另外,如果这不起作用,请告诉我,在没有测试的情况下编写

State_Dict = {}

with open('state.txt', 'r') as main_fd:
    for line in main_fd:
        line = line.strip() #left and right stripped    
        #if ("state" in line.lower()): #better version suggested in comments to handle 'state' and 'State'.
        if ("State" in line):
            state_key = "_".join(line.split()[1:])
            State_Dict[state_key] = []
        elif ("!" in line):
            continue #goes to next iteration of loop instead of stopping the loop unlike break
        else: #assuming last case
            State_Dict[state_key].append(line) #line has already been stripped

print(State_Dict)

你要找的是这样的东西。 考虑一次循环遍历一行,并为您的条件建立一系列检查。另外,如果这不起作用,请告诉我,在没有测试的情况下编写

State_Dict = {}

with open('state.txt', 'r') as main_fd:
    for line in main_fd:
        line = line.strip() #left and right stripped    
        #if ("state" in line.lower()): #better version suggested in comments to handle 'state' and 'State'.
        if ("State" in line):
            state_key = "_".join(line.split()[1:])
            State_Dict[state_key] = []
        elif ("!" in line):
            continue #goes to next iteration of loop instead of stopping the loop unlike break
        else: #assuming last case
            State_Dict[state_key].append(line) #line has already been stripped

print(State_Dict)


问题是,当你发生“!”时,你会跳出一个循环,而当新行开始时,如果我没有在“!”时跳出循环,则不会在“状态”时跳出循环发生它将作为一个我不希望发生的值被添加。在这种情况下,使用
继续
而不是
中断
。还有另一个名为
继续
的命令,它跳过执行循环的其余部分,并继续执行
迭代器中的下一个变量。
break
所做的是完全终止循环。尝试将其更改为
continue
并查看是否可以解决此问题。main\u fd是您的文件对象或迭代器之类的,您需要将此代码转换为1循环解决方案。你的内部循环被击中并耗尽文件对象,因为“城市”对计算机来说并没有任何意义,它只是迭代内部循环中的所有行。(直到它以任何方式打破)这就是为什么佛罗里达州及其城市被添加到德克萨斯州。问题是,当你发生“!”时,你打破了一个循环,而不是当新线以“州”开始时,如果我不在“!”时打破循环发生它将作为一个我不希望发生的值被添加。在这种情况下,使用
继续
而不是
中断
。还有另一个名为
继续
的命令,它跳过执行循环的其余部分,并继续执行
迭代器中的下一个变量。
break
所做的是完全终止循环。尝试将其更改为
continue
并查看是否可以解决此问题。main\u fd是您的文件对象或迭代器之类的,您需要将此代码转换为1循环解决方案。你的内部循环被击中并耗尽文件对象,因为“城市”对计算机来说并没有任何意义,它只是迭代内部循环中的所有行。这就是为什么佛罗里达和它的城市被加入德克萨斯州。哇,我才意识到你的答案和我的编辑完全一样。。。有什么机会。。。也许我应该删除我的。我唯一要改变的是,添加一些数据错误处理,而不是在行中写入
if“state”。lower()
,以匹配
“state”
“state”
。这应该作为一个最小的例子,并且应该根据需要添加一些东西。我将在中编辑它。@paritossingh-因此,如果该文件具有上述示例中的精确数据,则代码可以工作。当在原始数据上方有一个空行或另一组带有单词的行时,它似乎会失效。例如,在“State Texas”行之前,如果存在其他行,如“您应该访问的地方”,则会弹出错误消息-NameError:name“State_key”未定义。我希望它只抓取与我的字典相关的行。所以,第一步是找出它为什么会出错。(提示,请查看else块)。下一步,你必须考虑你能做些什么来处理任何被击中的场景,这些场景也应该被跳过。(暗示,继续)@vmx1987Wow我刚刚意识到你的答案和我的编辑完全一样。。。有什么机会。。。也许我应该删除我的。我唯一要改变的是,添加一些数据错误处理,而不是在行中写入
if“state”。lower()
,以匹配
“state”
“state”
。这应该作为一个最小的例子,并且应该根据需要添加一些东西。我将在中编辑它。@paritossingh-因此,如果该文件具有上述示例中的精确数据,则代码可以工作。当在原始数据上方有一个空行或另一组带有单词的行时,它似乎会失效。例如,在“State Texas”行之前,如果存在其他行,如“您应该访问的地方”,则会弹出错误消息-NameError:name“State_key”未定义。我希望它只抓取与我的字典相关的行。所以,第一步是找出它为什么会出错。(提示,请查看else块)。下一步,你必须考虑你能做些什么来处理任何被击中的场景,这些场景也应该被跳过。(暗示,继续)@vmx1987