Python 文本到字典不';行不通

Python 文本到字典不';行不通,python,dictionary,Python,Dictionary,我的Python代码所在的文件夹中有以下文本文件 78459581 黑色圆珠笔 12345670 足球 49585922 香水 83799715 洗发水 我已经编写了这段Python代码 file = open("ProductDatabaseEdit.txt", "r") d = {} for line in file: x = line.split("\n") a=x[0] b=x[1] d[a]=b print(d) 这是我收到的结果 b=x[1]

我的Python代码所在的文件夹中有以下文本文件

78459581
黑色圆珠笔
12345670
足球
49585922
香水
83799715
洗发水
我已经编写了这段Python代码

file = open("ProductDatabaseEdit.txt", "r")
d = {}
for line in file:
    x = line.split("\n")
    a=x[0]
    b=x[1]
    d[a]=b

print(d)
这是我收到的结果

b=x[1]  # IndexError: list index out of range
我的字典应该如下所示:

{"78459581" : "Black Ballpoint Pen"
 "12345670" : "Football"
 "49585922" : "Perfume"
 "83799715" : "Shampoo"}

我做错了什么?

一行被换行符终止,因此
line.split(“\n”)
永远不会给您多行

你可以作弊并做:

for first_line in file:
    second_line = next(file)

一行由换行符终止,因此
line.split(“\n”)
将不会提供多行

你可以作弊并做:

for first_line in file:
    second_line = next(file)

您需要剥离,而不是拆分

file = open("products.txt", "r")
d = {}
for line in file:
    a = line.strip()
    b = file.next().strip()
    # next(file).strip() # if using python 3.x
    d[a]=b

print(d)

{'12345670': 'Football', '49585922': 'Perfume', '78459581': 'Black Ballpoint Pen', '83799715': 'Shampoo'}

您需要剥离,而不是拆分

file = open("products.txt", "r")
d = {}
for line in file:
    a = line.strip()
    b = file.next().strip()
    # next(file).strip() # if using python 3.x
    d[a]=b

print(d)

{'12345670': 'Football', '49585922': 'Perfume', '78459581': 'Black Ballpoint Pen', '83799715': 'Shampoo'}

您可以通过使用简化解决方案,这可能是我能想到的最具python风格的解决方案:

>>> with open("in.txt") as f:
...   my_dict = dict((line.strip(), next(f).strip()) for line in f)
... 
>>> my_dict
{'12345670': 'Football', '49585922': 'Perfume', '78459581': 'Black Ballpoint Pen', '83799715': 'Shampoo'}

其中
in.txt
包含问题中描述的数据。必须
strip()
每一行,否则您的键和值会留下一个尾随的
\n
字符。

您可以使用简化您的解决方案,这可能是我能想到的最具python风格的解决方案:

>>> with open("in.txt") as f:
...   my_dict = dict((line.strip(), next(f).strip()) for line in f)
... 
>>> my_dict
{'12345670': 'Football', '49585922': 'Perfume', '78459581': 'Black Ballpoint Pen', '83799715': 'Shampoo'}

其中
in.txt
包含问题中描述的数据。必须
strip()
每行,否则您的键和值会留下一个尾随
\n
字符。

在我的解决方案中,我尝试不使用任何循环。因此,我首先用熊猫加载txt数据:

import pandas as pd
file = pd.read_csv("test.txt", header = None)
然后我将dict的键和值分开,例如:

keys, values = file[0::2].values, file[1::2].values
然后,我们可以直接将这两个压缩为列表并创建dict:

result = dict(zip(list(keys.flatten()), list(values.flatten())))

为了创建此解决方案,我使用了[question]:中提供的信息,在[question]:

中,我尝试不使用任何循环。因此,我首先用熊猫加载txt数据:

import pandas as pd
file = pd.read_csv("test.txt", header = None)
然后我将dict的键和值分开,例如:

keys, values = file[0::2].values, file[1::2].values
然后,我们可以直接将这两个压缩为列表并创建dict:

result = dict(zip(list(keys.flatten()), list(values.flatten())))

为了创建此解决方案,我使用了[question]:和[question]:中提供的信息。

您可以一次循环列表中的两项:

file = open("ProductDatabaseEdit.txt", "r")
data = file.readlines()
d = {}

for line in range(0,len(data),2):
    d[data[i]] = data[i+1]

您可以一次在列表上循环两项:

file = open("ProductDatabaseEdit.txt", "r")
data = file.readlines()
d = {}

for line in range(0,len(data),2):
    d[data[i]] = data[i+1]
发生什么事? 当您打开一个文件时,您会得到一个迭代器,当您在for循环中使用它时,它会一次给您一行

您的代码正在文件上迭代,以
\n
作为分隔符拆分列表中的每一行,但只提供一个列表项:与您已有的行相同。然后尝试访问列表中不存在的第二项。这就是为什么
索引器:列表索引超出范围的原因

如何修复它 您需要的是:

file = open('products.txt','r')
d = {}
for line in file:
    d[line.strip()] = next(file).strip()
在每个循环中,您向字典添加一个新键(通过将值分配给尚未存在的键),并将下一行指定为值。
next()
函数只是告诉
文件
迭代器“请转到下一行”。因此,要使点返回原点:在第一个循环中,将第一行设置为关键点,并将第二行指定为值;在第二个循环迭代中,将第三行设置为键,并将第四行指定为值;等等

每次都需要使用
.strip()
方法的原因是,示例文件的每行末尾都有一个空格,因此该方法将删除它

或 您还可以使用词典理解获得相同的结果:

file = open('products.txt','r')
d = {line.strip():next(file).strip() for line in file}
基本上,是上述相同代码的较短版本。篇幅较短,但可读性较差:不一定是你想要的东西(口味问题)。

怎么回事 当您打开一个文件时,您会得到一个迭代器,当您在for循环中使用它时,它会一次给您一行

您的代码正在文件上迭代,以
\n
作为分隔符拆分列表中的每一行,但只提供一个列表项:与您已有的行相同。然后尝试访问列表中不存在的第二项。这就是为什么
索引器:列表索引超出范围的原因

如何修复它 您需要的是:

file = open('products.txt','r')
d = {}
for line in file:
    d[line.strip()] = next(file).strip()
在每个循环中,您向字典添加一个新键(通过将值分配给尚未存在的键),并将下一行指定为值。
next()
函数只是告诉
文件
迭代器“请转到下一行”。因此,要使点返回原点:在第一个循环中,将第一行设置为关键点,并将第二行指定为值;在第二个循环迭代中,将第三行设置为键,并将第四行指定为值;等等

每次都需要使用
.strip()
方法的原因是,示例文件的每行末尾都有一个空格,因此该方法将删除它

或 您还可以使用词典理解获得相同的结果:

file = open('products.txt','r')
d = {line.strip():next(file).strip() for line in file}
基本上,是上述相同代码的较短版本。它较短,但可读性较差:不一定是您想要的东西(品味问题)。

尝试以下代码(数据位于/tmp/tmp5.txt中):

这给了你:

{'12345670': 'Football', '49585922': 'Perfume', '78459581': 'Black Ballpoint Pen', '83799715': 'Shampoo'}
请尝试以下代码(其中数据位于/tmp/tmp5.txt中):

这给了你:

{'12345670': 'Football', '49585922': 'Perfume', '78459581': 'Black Ballpoint Pen', '83799715': 'Shampoo'}

顺便说一句,我不认为这是作弊;-)使用
next()
是一个很好的解决方案。我称之为欺骗,因为如果违反了假设(偶数行),它就会被破坏。但我想在这种情况下,除非有具体的计划,否则它应该破裂;如果缺少的最后一行不是错误,您可以始终使用
next(file)
。实际上,它可能(没有测试过)不会中断,因为
next(file)
将引发
StopIteration
,并只是中断循环。@l3via这是我所做的<代码>对于文件中的第一行:[新行]第二行=下一行(文件)[新行]d[第一行]=第二行