我在Python代码所在的文件夹中有以下文本文件。
78459581
Black Ballpoint Pen
12345670
Football
49585922
Perfume
83799715
Shampoo
我已经编写了这个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"}
我做错了什么?
答案 0 :(得分:5)
一行以换行符终止,因此line.split("\n")
永远不会给您多行。
你可以作弊并做:
for first_line in file:
second_line = next(file)
答案 1 :(得分:3)
您可以使用dictionary generator来简化您的解决方案,这可能是我能想到的最灵活的解决方案:
>>> 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
字符。
答案 2 :(得分:2)
您需要删除\ n,而不是拆分
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'}
答案 3 :(得分:1)
当你打开一个文件时,你会得到一个迭代器,当你在 for 循环中使用它时,它会一次给你一行。
您的代码正在对文件进行迭代,将\n
作为分隔符拆分列表中的每一行,但是会为您提供仅包含一个项目的列表:您已经在同一行了。然后您尝试访问列表中的第二项,该项目不存在。这就是您获得IndexError: list index out of range
的原因。
你需要的是:
file = open('products.txt','r')
d = {}
for line in file:
d[line.strip()] = next(file).strip()
在每个循环中,您向字典添加一个新键(通过为尚未存在的键指定值)并将下一行指定为值。 next()
函数只是告诉file
迭代器"请转到下一行" 。因此,要驱动点回家:在第一个循环中,将第一行设置为键,并将第二行指定为值;在第二次循环迭代中,将第三行设置为键,并将第四行指定为值;等等。
每次需要使用.strip()
方法的原因是因为您的示例文件在每一行的末尾都有一个空格,因此该方法将删除它。
您还可以使用词典理解获得相同的结果:
file = open('products.txt','r')
d = {line.strip():next(file).strip() for line in file}
基本上,是上述相同代码的较短版本。它更短,但可读性更低:不一定是你想要的东西(品味)。
答案 4 :(得分:0)
在我的解决方案中,我试图不使用任何循环。因此,我首先使用pandas加载txt数据:
import pandas as pd
file = pd.read_csv("test.txt", header = None)
然后我为dict分隔键和值,例如:
keys, values = file[0::2].values, file[1::2].values
然后,我们可以将这两个作为列表直接压缩并创建一个词典:
result = dict(zip(list(keys.flatten()), list(values.flatten())))
要创建此解决方案,我使用了[问题]中提供的信息:How to remove every other element of an array in python? (The inverse of np.repeat()?)和[问题]:Map two lists into a dictionary in Python
答案 5 :(得分:0)
您可以一次循环列表两个项目:
file = open("ProductDatabaseEdit.txt", "r")
data = file.readlines()
d = {}
for line in range(0,len(data),2):
d[data[i]] = data[i+1]
答案 6 :(得分:0)
尝试此代码(数据位于 /tmp/tmp5.txt 中):
#!/usr/bin/env python3
d = dict()
iskey = True
with open("/tmp/tmp5.txt") as infile:
for line in infile:
if iskey:
_key = line.strip()
else:
_value = line.strip()
d[_key] = _value
iskey = not iskey
print(d)
这给了你:
{'12345670': 'Football', '49585922': 'Perfume', '78459581': 'Black Ballpoint Pen', '83799715': 'Shampoo'}