#python #list #csv
#python #Список #csv
Вопрос:
Я пытаюсь импортировать CSV на Python 3, затем добавить его и переместить, чтобы затем я мог использовать его для выполнения некоторых вычислений.
import csv
data=[]
file=input ("Enter file name: ")
with open(file,"r") as f:
reader=csv.reader(f)
for row in reader:
data.append(row) #creating list of lists
print (data)
print("Calculate COV")
lst = [val for subl in data for val in subl] #converting to list
float(lst) #error
print (lst)
def list_var(lst):
var = 0
avg = sum(lst)/len(lst)
for i in lst:
var = (avg - i)**2
return
SD=list_var(lst)
print (SD)
Это то, что я получаю:
TypeError: float() argument must be a string or a number
Комментарии:
1. как
lst
выглядит ваш?2. Зачем вам преобразовывать строку в целое число с помощью
float
? Вы имеете в виду «преобразование строки в float с помощьюfloat
» , не так ли?3. Это список без добавления: [[‘13.25’, ‘12.97’, ‘13.12’, ‘13.47’, ‘13.44’, ‘13.09’, ‘12.86’, ‘12.78’, ‘12.91’, ‘12.93’, ‘12.91’, ‘13.11’], [‘12.92’, ‘13.42’, ‘13.58’, ‘13.7’, ‘13.62’, ‘13.7’, ‘13.31’, ‘12.86’, ‘12.59’, ‘12.81’, ‘13.46’, ‘12.9’], [‘13.39’, ‘13.5’, ‘13.29’, ‘13.26’, ‘13.38’, ‘13.45’, ‘13.46’, ‘11.95’, «, ‘12.57’, ‘13.22’, ‘12.88’], [‘12.48’, ‘13.76’, ‘13.7’, ‘13.77’, ‘13.08’, ‘13.48’, ‘13.25’, ‘12.31’, ‘12.56’, ‘12.56’, ‘12.95’, ‘13.38’], [‘12.52’, ‘14.07’, ‘14.46’, ‘14.13’, ‘13.98’, ‘14.07’, ‘13.92’, ‘12.7’, ‘13.01’, ‘12.79’, ’13’, ‘13.13’]]
4. Я пытаюсь преобразовать строку в целые числа, чтобы я мог использовать их в функциях
5. @Tetra опять же, я думаю, вы имеете в виду «с плавающей точкой» — целые числа — это другой тип чисел — смотрите Руководство .
Ответ №1:
вы пытаетесь преобразовать list to float
. попробуйте
lst = [float(val) for subl in data for val in subl if val.strip()]
я думаю, что ваше понимание списка должно выглядеть следующим образом
lst= [[float(val) for val in subl if val.strip()] for subl in data ]
если ваш список выглядит так, как показано ниже, и вы дополняете список, попробуйте приведенный ниже код
lst=[['13.25', '12.97', '13.12', '13.47', '13.44', '13.09', '12.86', '12.78', '12.91', '12.93', '12.91', '13.11'],
['12.92', '13.42', '13.58', '13.7', '13.62', '13.7', '13.31', '12.86', '12.59', '12.81', '13.46', '12.9'],
['13.39', '13.5', '13.29', '13.26', '13.38', '13.45', '13.46', '11.95', '', '12.57', '13.22', '12.88'],
['12.48', '13.76', '13.7', '13.77', '13.08', '13.48', '13.25', '12.31', '12.56', '12.56', '12.95', '13.38'],
['12.52', '14.07', '14.46', '14.13', '13.98', '14.07', '13.92', '12.7', '13.01', '12.79', '13', '13.13']]
затем попробуйте
from itertools import chain
newlst=[ float(val) for val in chain.from_iterable(lst) if val.strip()]
этот метод не является хорошей практикой кодирования, но помогает
newlst=[]
for val in chain.from_iterable(lst):#
if val.strip():
try:
newlst.append(float(val))
except ValueError:
# here you print the val .
#and check what type of val is coming here and perform logic
#so that you can convert these type also into float
for i in val.split(';'):
newlst.append(float(i if i.strip() else 0))
pass
отключить itertools
for subl in data:
for val in subl:
if val.strip():
try:
newlst.append(float(val))
except ValueError:
# here you print the val .
#and check what type of val is coming here and perform logic
#so that you can convert these type also into float
for i in val.split(';'):
newlst.append(float(i if i.strip() else 0))
pass
Комментарии:
1. Возможно ли это без использования itertools?
2. @Tetra вам не нужен блок try / except для очистки вашего вывода, когда вы получаете данные из файла.
3. @PadraicCunningham Во-первых, как мне очистить данные? Во-вторых, теперь я получаю ошибку в первой функции: Трассировка (последний последний вызов): File «C:UsersMarcDesktopPythonMetal Lossother.py «, строка 22, в <module> SD=list_var(результаты) Файл «C:UsersMarcDesktopPythonMetal Lossother.py «, строка 18, в list_var среднее значение = sum(результаты)/len(результаты) Ошибка значения: недопустимый литерал для int() с базой 10: ‘1;2;3;4;5’
4. @Tetra добавьте, как выглядит строка на ваш вопрос
5. @Padraic Cunningham строка отображается символом «[]» перед добавлением
Ответ №2:
flattened = [float(x) for y in data for x in y if x]
print flattened
[13.25, 12.97, 13.12, 13.47, 13.44, 13.09, 12.86, 12.78, 12.91, 12.93, 12.91, 13.11, 12.92, 13.42, 13.58, 13.7, 13.62, 13.7, 13.31, 12.86, 12.59, 12.81, 13.46, 12.9, 13.39, 13.5, 13.29, 13.26, 13.38, 13.45, 13.46, 11.95, 12.57, 13.22, 12.88, 12.48, 13.76, 13.7, 13.77, 13.08, 13.48, 13.25, 12.31, 12.56, 12.56, 12.95, 13.38, 12.52, 14.07, 14.46, 14.13, 13.98, 14.07, 13.92, 12.7, 13.01, 12.79, 13.0, 13.13]
Если вы хотите очистить свой вывод, сделайте это перед добавлением к данным.
with open(file,"r") as f:
reader=csv.reader(f)
for row in reader:
data.append(row)
Поместите print row
в свой цикл, чтобы точно увидеть, как выглядят ваши данные, затем удалите все, что вам нужно, чтобы сделать его допустимым для приведения в виде float.
Где бы ваши данные ни выглядели :
lst= [['1;2;3;4;5'], ['65;5;64;65;2'], ['215;5;85;65;54']]
spl= [x.split(";") for y in lst for x in y]
flattened = [float(x) for y in spl for x in y if x]
print flattened
[1.0, 2.0, 3.0, 4.0, 5.0, 65.0, 5.0, 64.0, 65.0, 2.0, 215.0, 5.0, 85.0, 65.0, 54.0]
Комментарии:
1. Вы имеете в виду «для y в данных для x»?
2. @Tetra, да, какой бы ваш список списков вы ни опубликовали, он у вас есть
""
там, поэтому usingif x
не будет пытаться преобразовать его в значение с плавающей точкой.3. Я все еще получаю: «ValueError: не удалось преобразовать строку в float: »
4. соответствует ли ваш список тому, что вы опубликовали в комментариях, и в чем именно ошибка?
5. Нет, сейчас я использую простой: трассировка (последний последний вызов): Файл «C:UsersMarcDesktopPythonMetal Lossother.py «, строка 11, в файле <module> lst = [float(x) для y в data для x в y, если x] «C:UsersMarcDesktopPythonMetal Lossother.py «, строка 11, в <listcomp> lst = [float(x) для y в data для x в y, если x] Ошибка значения: не удалось преобразовать строку в float: ‘1;2;3;4;5’