Python 文本到字典不';行不通
我的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]
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[第一行]=第二行