CSV хранит только строковые столбцы.Использование его для хранения строк, целых чисел, чисел с плавающей точкой и некоторых других базовых типов хорошо, если вы вручную конвертируете объекты: всякий раз, когда вы делаете str(i)
в int, вы можете вернуть int с помощью int(s)
.
Но это не так для списка поплавков.Нет функции, которую вы можете использовать, чтобы вернуть результат str(lst)
в произвольный список. 1 И это не так для… всего, что у вас есть, которое, скорее всего, является массивом или пандамиСерии… либо. 2
Если вы можете хранить каждое число с плавающей точкой как отдельный столбец, вместо того, чтобы хранить их список в одном столбце, это самый простой ответ.Но это может быть неуместно. 3
Итак, вам просто нужно выбрать какую-то другую функцию для использования вместо неявного str
, который может бытьобратный с простым вызовом функции.Существуют форматы, предназначенные для сохранения данных в строки - JSON, XML, даже вложенный CSV - так что это первое, на что нужно обратить внимание.
Обычно JSON должен быть первым, на который вы обращаете внимание.Пока он может обрабатывать все ваши данные (и он определенно может здесь), он чрезвычайно прост в использовании, кто-то уже подумал, что он выбрасывает все надоедливые крайние случаи, и есть код для его анализа для каждой платформы во вселенной.
Итак, вы пишете значение следующим образом:
row_dict['prob_array'] = json.dumps(res)
И затем вы можете прочитать его обратно так:
prob_array = json.loads(row['prob_array'])
Если prob_array
на самом деле является массивом numy илиСерии Pandas или что-то в этом роде, а не список, вам нужно либо преобразовать с помощью list
, либо использовать методы Numpy или Pandas JSON вместо модуля stdlib.
Единственная реальная проблема заключается в том, что если вы хотитеCSV должен быть удобочитаемым / редактируемым, экранированные запятые и кавычки могут быть довольно уродливыми.
В этом случае вы можете определить более простой формат, который все еще легко писать и анализировать для ваших конкретных данных.и также более удобочитаемым, как просто разделенные пробелами числа:
row_dict['prob_array'] = ' '.join(map(str, res))
prob_array = [float(val) for val in row['prob_array'].split()]
1.Иногда вы можете использовать ast.literal_eval
, но полагаться на это никогда не будет хорошей идеей, и здесь это не работает.
2.Удобный для чтения формат, используемый numpy и Pandas, еще менее удобен для синтаксического анализа, чем формат, используемый списками Python.Вы могли бы переключиться на их repr
вместо их str
, но оно все равно не будет ast.literal_eval
.
3.Для наглядного примера представьте таблицу с двумя различными списками произвольной длины ...