查找字符串以指定格式失败的地方

时间:2018-09-03 10:21:53

标签: python pandas

我有一个必须像

的字符串
[[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],

File和示例数据。它是可下载的csv文件。使用";"作为分隔符。

如果我能得到一个通用答案,它会打印出所有失败的案例(即它不是list of list),那就太好了

2 个答案:

答案 0 :(得分:3)

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语句。

答案 1 :(得分:0)

将字符串分割成一个列表,放在'],['处,然后在每个部分中测试方括号,如果发现有违规部分+ 2个方括号。

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