2015-12-01 4 views
2

У меня есть текстовый файл, содержащие координаты в виде:Tokenising целых чисел в строке

[-1.38795678, 54.90352965] 
[-3.2115, 55.95530556] 
[0.00315428, 51.50285246] 

Я хочу, чтобы иметь возможность перебирать каждую координату, чтобы проверить, какой многоугольник он находится в (UK графствах в шейпе), однако я не уверен, как tokenise числа так, что я могу иметь код вдоль линий ...

for line in coordinates: 
    for poly in polygons: 
     if points in polygons: 
      print(polygons) 
      break 

     if points not in polygons: 
      continue 

на данный момент они являются строками, но я хочу каждую линию, которая будет состоять из два момента, так что я могу попробовать и найти их в полигоне.

+1

Добавить фактический формат файла на ваш вопрос –

ответ

3

Вы можете превратить строку в кортеж, используя literal_eval.

>>> from ast import literal_eval 
>>> s = "[-1.38795678, 54.90352965], [-3.2115, 55.95530556], [0.00315428, 51.50285246]" 
>>> seq = literal_eval(s) 
>>> print seq[0][1] 
54.90352965 

Edit: если координаты находятся на отдельных линиях без запятых,

from ast import literal_eval 

s = """[-1.38795678, 54.90352965] 
[-3.2115, 55.95530556] 
[0.00315428, 51.50285246]""" 

seq = [literal_eval(line) for line in s.split("\n")] 
#or 
seq = literal_eval(s.replace("\n", ",")) 
print seq[0][1] 
+0

Если я загружаю, если файл не читая его, я получаю ошибку ValueError: некорректный узел или строку: <_io.TextIOWrapper name = '/ Users/JoshuaHawley/sundayCoordinates.txt' mode = 'r' encoding = 'US-ASCII'>, или если я прочитаю его, а затем выполните seq = literal_eval (s), он отправит обратно error Файл «», строка 2 [-3.2115, 55.95530556] ^ Синтаксис: недействительный синтаксис Я просто взял координаты из твитов, а затем хочу сопоставить плотности по всей Великобритании, но его часть взяла на себя все усилия, чтобы попытаться разобраться. – JTH

+1

@JoshuaHawley: похоже, что у вашего файла данных нет запятых между строками; попробуйте применить 'literal_eval' к каждой строке отдельно. –

+0

Файл имеет только координаты, перечисленные каждый в новой строке [-1.38795678, 54.90352965] [-3.2115, 55.95530556] [0.00315428, 51.50285246] без запятых между каждой строкой – JTH

1

Вы также можете использовать регулярное выражение, которое будет значительно быстрее, чем аст:

import re 
with open("in.txt") as f: 
    r = re.compile("[-]?\d+\.\d+") 
    data = [list(map(float, r.findall(line))) for line in f] 

Некоторые тайминги:

In [14]: %%timeit 
with open("test.txt") as f: 
    data = [literal_eval(line) for line in f] 
    ....: 
100 loops, best of 3: 2.01 ms per loop 

In [15]: %%timeit 
with open("test.txt") as f: 
    r = re.compile("[-]\d+\.\d+") 
    data = [list(map(float, r.findall(line))) for line in f] 
    ....: 
1000 loops, best of 3: 403 µs per loop 

with open("test.txt") as f: 
    r = re.compile("[-]?\d+\.\d+") 
    data = [list(map(float, r.findall(line))) for line in f] 
    ....:  

In [38]: with open("test.txt") as f: 
      data2 = [literal_eval(line) for line in f] 
    ....:  

In [39]: data == data2 
Out[39]: True 

Просто вскрышных и расщепление будет быстрее снова:

In [40]: %%timeit 
    ....: with open("test.txt") as f: 
    ....:  data = [list(map(float, line.strip("[]\n").split(","))) for line in f] 
    ....: 
1000 loops, best of 3: 249 µs per loop 
Смежные вопросы