我有以下代码:
check = open(a, 'r')
line =check.readlines()
for items in line:
breakup= items.split()
length = (len(breakup)-1)
number[0], salary[1], position[2], oname[3:length], first[-1] = breakup
data.append(tuple([first, oname, number, position, salary]))
这段代码从具有通用信息的文本文件中读取,例如:
15674 24000 Manager Gregory the 1st John
我正在尝试使用for循环按照我提出的顺序将信息附加到数据中,以便上述信息显示为:
('John', 'Gregory the 1st', 15674, 'Manager', 24000)
我从第3位切换到倒数第二位的原因是oname可以是任意数量的名字但是名字总是一个项目所以我100%确定我可以从位置[-1] <调用它/ p>
我遇到的问题是它无法正常工作。代码将正确读取文件并正确分解,但我无法正确重新排列。
答案 0 :(得分:5)
您需要以不同的方式拆分线,然后分配部分而不用索引和切片分配:
number, salary, position, rest = items.split(None, 3)
oname, first = rest.rsplit(None, 1)
data.append((first, oname, number, position, salary))
这会保留oname
字段中的空格。第一个呼叫只分裂3次,给你前三个字段和一个余数。然后,rest
中的其余部分将从右侧拆分一次,以便为您提供oname
和first
。
演示:
>>> items = '15674 24000 Manager Gregory the 1st John\n'
>>> number, salary, position, rest = items.split(None, 3)
>>> oname, first = rest.rsplit(None, 1)
>>> first, oname, number, position, salary
('John', 'Gregory the 1st', '15674', 'Manager', '24000')
答案 1 :(得分:2)
这个怎么样?它将每一行拆分为令牌,然后将每个令牌放在适当的位置。你正在向后做事 - 你应该索引令牌列表,而不是你想要分配它们的变量。这假设“经理”不包含空格 - 否则,经理和姓名将不明确。
data = []
with open(a,r) as f:
for lines in f:
toks = lines.split()
data.append((toks[-1], toks[3:-1], int(toks[0]), toks[2], int(toks[1])))
这将使一个单词列表成为oname,而不是一个包含空格的字符串。如果您希望它是字符串,只需将toks[3:-1]
替换为" ".join(toks[3:-1])
。