#python #string #replace #split
Вопрос:
У меня есть CSV-файл, в котором в одном столбце хранятся два значения в одной позиции, например [345 1234], но иногда нет такого значения, как [] или только одно [456]. Я пишу сценарий, который хорошо работает для пустых или одиночных значений, но он не удался для двойных значений. Я попытался разделить, заменить пробел , но это дало ошибку из-за пустого или единственного значения. Как я могу включить эти два значения в цикл, который может работать как для пустого, так и для одного значения?
формат файла df выглядит следующим образом:
20200423.GS022.mseed_597000,[ ],
20200423.GS022.mseed_600000,[ ],
20200423.GS022.mseed_603000,[424 1901],
20200423.GS022.mseed_606000,[2259],
#code for an empty or single value
with open('myfile.txt','w') as f:
for i in range(len(df)):
itp = df.iloc[i, 1].replace('[', '').replace(']', '')
if itp != '':
P=int(float(itp))/100
else:
P=0
Я получил эту ошибку,
Ошибка значения: не удалось преобразовать строку в значение с плавающей точкой: ‘424 1901’
Ответ №1:
Причина сбоя в том, что вы конвертируете itp
float
в 424 1901
строку с пробелом и, следовательно, не можете быть преобразованы float
.
Если 424
и 1901
имеют 2 разных значения, вы можете использовать приведенный ниже код:
with open('myfile.txt','w') as f:
for i in range(len(df)):
itp = df.iloc[i, 1].replace('[', '').replace(']', '')
for val in itp.split():
if val != '':
P=int(float(val))/100
else:
P=0
print (f'P: {P}')
Однако, если оба являются одним значением, например 4241901
, вы можете использовать приведенный ниже код:
with open('myfile.txt','w') as f:
for i in range(len(df)):
itp = df.iloc[i, 1].replace('[', '').replace(']', '').replace(" ","")
if itp != '':
P=int(float(itp))/100
else:
P=0
Комментарии:
1. Да, это разные значения, но мне нужны три условия, P может быть равно нулю, только если оно пустое, иначе каждое число в itp будет разделено на 100.
2. Так вот что делает код. Если значение val пустое, то P равно 0. Первый фрагмент кода предназначен для вас, так как это разные значения.
3. О да, это работает, но он не выводит значение P, если оно равно нулю.
4. Круто.печать никогда не была частью кода. В любом случае, в отредактированном коде также добавлена инструкция печати.
5. да, похоже, что после использования split он не будет использовать пустое значение в цикле.