Вопрос:
Я пишу функцию python для добавления данных в текстовый файл, как показано ниже,
Проблема в том, что переменная, var, может быть массивом 1D numpy, 1D-списком или просто числом с плавающей запятой, я знаю, как преобразовать numpy.array/list/float в строку отдельно (то есть с учетом типа), но есть ли метод преобразования var в строку без знания его типа?
def append_txt(filename, var): my_str = _____ # convert var to string with open(filename,’a’) as f: f.write(my_str + ‘n’)
Редактировать 1: Спасибо за комментарии, извините, может быть, мой вопрос был недостаточно ясен. str(var) на numpy даст что-то вроде []. Например, var = np.ones((1,3)), str(var) даст [[1. 1. 1.]] [[1. 1. 1.]] и [] нежелательно,
Изменить 2: Поскольку я хочу написать чистые номера (то есть не [ или ]), кажется, типа проверка неизбежна.
Ответ №1
Проверка типов – это не единственная возможность делать то, что вы хотите, но определенно один из самых простых:
import numpy as np def to_str(var): if type(var) is list: return str(var)[1:-1] # list if type(var) is np.ndarray: try: return str(list(var[0]))[1:-1] # numpy 1D array except TypeError: return str(list(var))[1:-1] # numpy sequence return str(var) # everything else
EDIT: Еще один простой способ, который не использует проверку типов (спасибо jtaylor за то, что дал мне эту идею), состоит в том, чтобы преобразовать все в один и тот же тип (np.array), а затем преобразовать его в строку:
import numpy as np def to_str(var): return str(list(np.reshape(np.asarray(var), (1, np.size(var)))[0]))[1:-1]
Пример использования (оба метода дают одинаковые результаты):
>>> to_str(1.) #float ‘1.0’ >>> to_str([1., 1., 1.]) #list ‘1.0, 1.0, 1.0’ >>> to_str(np.ones((1,3))) #np.array ‘1.0, 1.0, 1.0’ Ответ №2
Если вы не знаете, что такое тип var, вы можете проверить тип, используя
from collections import Iterable if isinstance(var,Iteratable): mystring=».join(map(str,var)) else: mystring=str(var) Ответ №3
Возможно, что вы ищете, это repr()
Это противоположность функции eval.
Вот что делает eval:
eval(‘[1,3]’) # [1, 3]
Вот то, что repr делает:
repr(‘example’) # «‘example'» repr(0.1) # ‘0.1’ repr([1,2]) # ‘[1,2]’ Ответ №4
str может преобразовать любой тип в строку. Это может быть numpy.array/list/float
# using numpy array new_array = numpy.array([1,2,3]) str(new_array) >> ‘[1 2 3]’ # using list new_list = [1, 2, 3] str(new_list) >> ‘[1, 2, 3]’ # using float new_float = 1.1 str(new_float) >> ‘1.1’