Если у вас есть csv, используйте csv-модуль для его чтения (или чтения на пандах, который автоматически преобразует ваши значения в подходящие типы):
Создание демонстрационного файла:
data = """-0.02872239612042904, -0.19755002856254578, 0.31345692434, -0.0009348573822
-1.02872239612042904, -1.19755002856254578, 1.31345692434, -1.0009348573822
-2.02872239612042904, -2.19755002856254578, 2.31345692434, -2.0009348573822
-3.02872239612042904, -3.19755002856254578, 3.31345692434, -3.0009348573822
apple, prank, 0.23, nothing
"""
with open("datafile.csv","w") as f:
f.write(data)
Считайте демофайл обратно в
def safeFloat(text):
try:
return float(text)
except ValueError: # maybe even catchall here
return float("nan")
data = []
import csv
with open("datafile.csv","r") as r:
csv = csv.reader(r, delimiter=',')
for l in csv:
data.append(list(map(safeFloat,l))) # safeFloat to capture errors
print(data)
Если в ваших данных есть non-float, вы можете использовать def safeFloat(text)
вместо float
внутри map
для защиты от анализаошибки: какой-то текст не может быть преобразован в число с плавающей точкойи цифры до / после него:
r'[+-]?\d+\.\d+' # would allow for 123.1245 - but not for 123 or .1234
# would allow an optional +- before numbers
Вы можете проверить шаблоны, например, http://regex101.com - этот шаблон с демонстрационными данными можно найти здесь: https://regex101.com/r/xSiyO1/1
pandas solution (только действительные данные):
data = """-0.02872239612042904, -0.19755002856254578, 0.31345692434, -0.0009348573822
-1.02872239612042904, -1.19755002856254578, 1.31345692434, -1.0009348573822
-2.02872239612042904, -2.19755002856254578, 2.31345692434, -2.0009348573822
-3.02872239612042904, -3.19755002856254578, 3.31345692434, -3.0009348573822
"""
with open("datafile.csv","w") as f:
f.write(data)
import pandas as pd
import numpy as np
df = pd.read_csv("datafile.csv", dtype={"a":np.float64,"b":np.float64,"c":np.float64,"d":np.float64},names=["a","b","c","d"] )
print(df)
Вывод:
a b c d
0 -0.028722 -0.19755 0.313457 -0.000935
1 -1.028722 -1.19755 1.313457 -1.000935
2 -2.028722 -2.19755 2.313457 -2.000935
3 -3.028722 -3.19755 3.313457 -3.000935