我正在从 file.txt 中读取内容,该文件具有离散的Node ID数据以及每行中各自的x轴和y轴位置:
Node_1 20.00 35.50
Node_2 77.00 21.40
Node_3 43.50 98.30
现在,我想读取此数据以形成python script.py 中的列表:
Node_1 = [20.00 , 35.50]
Node_2 = [77.00 , 21.40]
Node_3 = [43.50 , 98.30]
nodes = [Nodes_1, Nodes_2, Nodes_3]
所以最终,我将有一个节点的列表,例如[[20.00,35.50],[77.00,21.40],[43.50,98.30]]。
我已经使用下面的python代码尝试过它:
inputlist = list()
fhand = open('file.txt','r')
for line in fhand:
for word in line.split():
inputlist.append(word)
//Value in inputlist[0]// = [inputlist[1],inputlist[2]]
nodes.append(inputlist[0])
del inputlist[:]
我没有找到正确的方法来正确选择python代码来填充inputlist [0] 中的值。
答案 0 :(得分:1)
我认为最好在节点是唯一的前提下使用字典。如果节点不是唯一的,我们可以使用列表作为值,但是在values()
方法中您将拥有列表列表
您可以通过以下方式做到这一点:
nodes_dict = dict()
with open('file.txt','r') as f:
for line in f:
node_name, xpos, ypos = line.split()
#Nodes are not unique
if node_name in nodes_dict.keys():
nodes_dict[node_name].append([xpos, ypos])
else:
nodes_dict[node_name] = [[xpos, ypos]]
#Nodes are unique
nodes_dict[node_name] = [xpos, ypos]
node_names = nodes_dict.keys()
node_coordinates = nodes_dict.values()
编辑
根据@bruno desthuilliers的评论,更好的解决方案:
from collections import defaultdict
nodes_dict = defaultdict()
with open('file.txt','r') as f:
for line in f:
node_name, xpos, ypos = line.split()
#No check needed because defaultdict takes care of this
#Otherwise check would be if node_name in nodes_dict
nodes_dict[node_name].append([xpos, ypos])
node_names = nodes_dict.keys()
node_coordinates = nodes_dict.values()
答案 1 :(得分:0)
这应该可以完成工作:
nodes = list()
fhand = open('file.txt','r')
for line in fhand:
nodes.append(line.split()[1:])
答案 2 :(得分:0)
您很近。主要问题是:
Node_1
,Node_2
等的第一列。为此,您可以通过[1:]
进行索引。float
。[0]
编制索引。这是一个示范:
from io import StringIO
file = StringIO("""Node_1 20.00 35.50
Node_2 77.00 21.40
Node_3 43.50 98.30""")
fhand = file # use open('file.txt','r') instead of file
nodes = []
for line in fhand:
inputlist = []
for value in line.split()[1:]:
inputlist.append(float(value))
nodes.append(inputlist)
print(nodes)
[[20.0, 35.5], [77.0, 21.4], [43.5, 98.3]]
答案 3 :(得分:0)
我还建议使用字典,当不存在重复的名称时,这是另一种选择。
text_file = open("file.txt", "r")
lines = text_file.read().splitlines()
s_lines = [ line.split() for line in lines ]
nodes = { line[0]: [float(x) for x in line[1:]] for line in s_lines }
print (nodes)
#=> {'Node_3': [43.5, 98.3], 'Node_2': [77.0, 21.4], 'Node_1': [20.0, 35.5]}
答案 4 :(得分:-1)
如果我正确理解了您的问题,这应该会为您带来预期的结果:
nodes = []
with open('file.txt','r') as f:
for lineno, line in enumerate(f, 1):
line = line.strip()
if not line:
continue
try:
node_name, xpos, ypos = line.split()
nodes.append([float(xpos), float(ypos)])
except Exception as e:
print("line #{} seems broken (got {})".format(lineno, e))
continue
print(nodes)
编辑:您说
我想首先创建以下列表:Node_1 = [20.00,35.50] Node_2 = [77.00,21.40] Node_3 = [43.50,98.30]
重点是:由于您不知道文件中将有多少个“节点”,因此您将不知道将需要多少个“ node_xxx”变量-并且您已经将这些值设为{{1 }}。现在,如果您也想保留节点名称,只需使用字典而不是列表即可:
nodes[xxx]
答案 5 :(得分:-1)
任何时候想要
您的思维方向错误。而不是枚举,而是使用列表来捕获您的值。如果您想以一种有用的方式命名事物(node1,node2,node3在它们仍然只是可以被索引标识的节点的意义上就没有用),那么您可以使用字典。例如
cities = {}
cities['hamburg'] = ...
cities['berlin'] = ...
cities['new-york'] = ...