Найти, где строка терпит неудачу в указанном формате - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть строка, которая должна выглядеть как

[[12.12345678,12.12345678],[12.12345678,12.12345678],[12.12345678,12.12345678],..]

То есть это выглядит как list of list. Но иногда эта строка имеет искажения, которые выглядят так:

[12.12[12.12345678,12.12345678],

Еще один такой случай

[21.28211533,21.22[21.28211517,84.13454000],

Дополнительный [12.12 можно увидеть в первом примере. Могут быть и другие форматы, из-за которых он тоже не работает.

В настоящее время я использую ast.literal_eval, чтобы проверить, находится ли он в формате list of lists

import pandas as pd
import ast
import sys

df = pd.read_csv("whole.csv", sep = ";")
_ = 1
for index, row in df.iterrows():
    try:
        ast.literal_eval(row["gnns_base_lat_long"])
        _ += 1
        print("\rSuccessful %d" % _, end="")
    except:
        _ += 1
        print("Fail %d" % _)
        print(row["gnns_base_lat_long"])
print("\n")

sys.exit(0)

Как написать сценарий, чтобы в случае сбоя ast.literal_eval я пошел в эту строку, чтобы найти причину сбоя?

Пример вывода будет

Fail: [12.12[12.12345678,12.12345678],

Файл с образцами данных. Это загружаемый CSV-файл. Используйте ";" в качестве разделителя.

Было бы замечательно, если бы я мог получить обобщенный ответ , который печатает все случаи, в которых он терпит неудачу (то есть это не list of list)

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018
def check_string(s):
    for item in s.split(','):
        if item.count('[') > 1:
            print(item, s.index(item))
            return False
    return True

with open('data.csv') as file_obj:
    lines = file_obj.readlines()
    for line in lines:
        check_string(line[1:-1])

Выход:

[21.28[21.28033850 1326
[21.93[21.28210850 1482
[21.03[21.28184083 0

Укороченная версия ответа Джека. Это завершится при первом появлении неверной строки Если вам нужны все неправильные местоположения строк, удалите операторы return.

0 голосов
/ 03 сентября 2018

Разбейте строку на список в '], [', а затем проверьте на наличие квадратных скобок в каждой части, если найдена одна печатная часть + две квадратные скобки.

string =str('[[12.12345678,12.12345678],[12.12[12.12345678,12.12345678], 
[12.12345678,12.12345678]]')
string = string[1:-1]
string = string.split(",")
x = 0
fl = 0
for i in string :
    b = (string[x])
    c = 0
    detect = 0
    for i in range(len(b)):
        d = (b[c])
        if d=='[':
            detect += 1
        c += 1
    if detect == 2:
        if fl == 0:
            print(string[x]+']')
        else:
            print('['+string[x])
    x += 1
    if fl == 0:
        fl = 1
    else:
        fl = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...