我有一个必须像
[[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
),那就太好了
答案 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