Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python中的文件获取复杂输入?_Python_Python 2.7_Python 3.x - Fatal编程技术网

从python中的文件获取复杂输入?

从python中的文件获取复杂输入?,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我正在开发一个程序,在这个程序中,我必须找到一个点是否位于圆内,并且数据由用户给出。我已经准备好了我的算法,但我正在努力量化用户提供给特定容器(如列表或字典)的数据。它必须采用如下格式,并作为参数通过文件传递 Center: (2.12, -3.48); Radius: 17.22; Point: (16.21, -5) 我试过下面的代码 from sys import argv file_name = argv[1] fp = open(file_name,'r+') contents

我正在开发一个程序,在这个程序中,我必须找到一个点是否位于圆内,并且数据由用户给出。我已经准备好了我的算法,但我正在努力量化用户提供给特定容器(如列表或字典)的数据。它必须采用如下格式,并作为参数通过文件传递

Center: (2.12, -3.48); Radius: 17.22; Point: (16.21, -5)
我试过下面的代码

from sys import argv

file_name = argv[1]
fp = open(file_name,'r+')

contents = [line.strip('\n') for line in fp]
content = [item.split(' ') for item in contents]

#content = fp.read().split(';') #commented

print (contents, '\n' , content)
输出为:-

['Center: (2.12, -3.48); Radius: 17.22; Point: (16.21, -5)']
[['Center:', '(2.12', '-3.48);', 'Radius:', '17.22;', 'Point:', '(16.21,', '-5)']
所以,很明显,我离得到这些整数值来解决这个问题还差得远。也由于添加了“;”:“使局势更加复杂

我应该用什么方法分别量化每个术语。如果我只能得到那些整数值,有什么办法吗?

那么.split';'呢还有eval,因为数据几乎是python格式的?这可能是危险的,但如果你想快速得到它,并且可以依靠输入,这是最简单的方法

显然,正确的方法是使用regex,可通过import-re获得:

然后

point = (match.group(0), match.group(1))
等等


不确定regex模式,还没有测试过。文档。

如果数据是正则的,您可以使用如下正则表达式:

import re
data = "Center: (2.12, -3.48); Radius: 17.22; Point: (16.21, -5)"
result = re.search('Center: \(([-0-9\.]+), ([-0-9\.]+)\); Radius: ([-0-9\.]+); Point: \(([-0-9\.]+), ([-0-9\.]+)\)', data)
center_x, center_y, radius, point_x, point_y = map(float, result.groups())
正如洛洛普的回答所建议的那样,不要使用eval

而是使用:

安全地计算表达式节点或包含Python文本或容器显示的Unicode或Latin-1编码字符串。提供的字符串或节点只能由以下Python文本结构组成:字符串、数字、元组、列表、dicts、boolean和None

这可以用于安全地评估包含来自不受信任源的Python值的字符串,而无需自己解析这些值。它不能计算任意复杂的表达式,例如涉及运算符或索引的表达式

例如:

import ast

input_line = "Center: (2.12, -3.48); Radius: 17.22; Point: (16.21, -5)"

center, radius, point = input_line.split(";")
center = ast.literal_eval(center.split(":")[1].strip())
radius = ast.literal_eval(radius.split(":")[1].strip())
point = ast.literal_eval(point.split(":")[1].strip())

print center, radius, point
这将产生:

(2.12, -3.48) 17.22 (16.21, -5)
中心是第一个元组。半径是单个值。point是最后一个元组

这是在分号处拆分字符串;在每个值之间。此拆分后的中心值为:

Center: (2.12, -3.48)  

其他值看起来类似。接下来,我们通过使用冒号上的拆分,在每个拆分的第二部分上使用literal_eval:。我们还去掉了前导空格和尾随空格,因为冒号和值之间有一个空格。如果不这样做,我们会得到一个indicationException。

很好,它成功了。我没有意识到我也可以使用正则表达式。谢谢@AnonymousThanky@lolopop,我尝试了上面评论中描述的匿名方式,效果不错。
Center: (2.12, -3.48)