#python #arrays #python-3.x #list #numpy
#python #массивы #python-3.x #Список #numpy
Вопрос:
Я написал фрагмент кода, который выполняет поиск каталогов для текстового файла и на основе условия if, которое я написал, копирует, сохраняет и записывает в новый файл. Проблема, с которой я борюсь, заключается в том, что когда разные условия if добавляются к одному и тому же пустому списку, он сохраняет выходные данные второго «условия if» в виде нового массива элементов. Однако я хочу, чтобы выходные данные нескольких условий if сохранялись в одной строке. Чтобы быть более конкретным, вот как мой код сохраняет и записывает в текстовый файл.
import matplotlib.pyplot as plt
import numpy as np
import math
from scipy.optimize import curve_fit
from IPython import embed
import os
File = 'results.txt'
ospath = os.walk('/Users/analyses/')
mylist=[]
for subdir, dirs, files in ospath:
if File in files:
filepath = subdir '/' File
with open(filepath) as fp:
for line in fp:
line_list = []
if "Bckgnd subtracted source c/r" in line:
line_array = line.split(" ")
mylist.extend((line_array[5],line_array[7].rstrip("n")))
elif "Bckgnd subtracted source cnts" in line:
line_array = line.split(" ")
mylist.extend((line_array[5],line_array[7].rstrip("n")))
mylist.append(line_list)
mylist = np.asarray(mylist)
with open("mylist.txt", "w") as txt_file:
for line in mylist:
txt_file.write('n'.join(','.join(elems) for elems in mylist))
Вывод :
11.3,4.8
id_06,BANANA
9.3,5.6
id_01,APPLE
8.7, 23.8
id_08, ORANGE
mylist[0] = [11.3,4.8] #comes from first if condition
mylist[1] = [id_06,BANANA] #comes from second if condition
Где так, как я хочу:
11.3,4.8,id_06,BANANA
9.3,5.6,id_01,APPLE
8.7, 23.8, id_08, ORANGE
где mylist[0] = [11.3,4.8,id_06,BANANA]
Комментарии:
1. Попробуйте использовать оператор
if
andelif
вместо двухif
, потому что тогда одновременно будет активировано только одно условие, даже если выполнены оба условия.2. Я получаю те же результаты с elif.
3. Вы уверены, что с вашими отступами все в порядке? В приведенном вами примере операторы mylist.append, помимо прочего, выпадают из своих блоков if.
Ответ №1:
Не совсем уверен, подходит ли это для вашей проблемы. Но вы можете попробовать следующее:
mylist = []
with open(filepath) as fp:
for line in fp:
line_list = []
if "condition1" in line:
line_array = line.split(" ")
line_list.extend([line_array[5],line_array[7].rstrip("n")])
if "condition2" in line:
line_array = line.split(" ")
line_list.extend((line_array[5],line_array[7].rstrip("n")))
mylist.append(line_list)
mylist = np.asarray(mylist)
При этом используется отдельный список для каждой строки, который расширяется, чтобы получить единый список, а не список списков, как это произойдет при добавлении данных. Список очищается для каждой строки.
Возможно, это не самый быстрый или элегантный способ сделать это, но он должен решить вашу проблему.
Ответ №2:
Похоже, что несколько отступов в вашем примере кода могут быть неправильными — кажется, что for line in fp:
строка должна иметь отступ на один уровень меньше, а mylist.append(...)
строки должны иметь отступ на один уровень больше.
Что касается вашего вопроса: если я правильно понимаю, вам нужен line_array из обоих условий if в одной строке вашего mylist.txt файл. Предполагая, что это так, попробуйте использовать array.extend(...)
:
with open(filepath) as fp:
for line in fp:
line_array = []
if "condition1" in line:
line_array = line.split(" ")
mylist.extend([line_array[5],line_array[7].rstrip("n")])
if "condition2" in line:
line_array = line.split(" ")
mylist.append([line_array[5],line_array[7].rstrip("n")])
Комментарии:
1. Это может привести к проблемам, когда первое условие выполняется, а второе — нет. В этом случае mylist может быть расширен дважды и имеет неправильную размерность.
2. Я предполагал, что из-за наличия двух блоков if в OP было бы приемлемо, чтобы выполнялось только одно условие и чтобы длина каждой строки в списке варьировалась. Если оба условия должны быть выполнены, то, конечно же, они должны быть сведены к одному условию (или вложенным условиям) вместо этого? Возможно, требуется дальнейшее разъяснение.
3. Да, оба условия определенно выполняются, и я получаю неправильные результаты как для этого случая, так и для предложения @FabianZills. В обоих случаях я получаю кучу пустых списков, так что получается массив из 20 пустых элементов, строка из условия1, строка из условия2 и еще 20 пустых элементов, которые затем выводятся из другого текстового файла.
4. Без просмотра содержимого filepath отладка может оказаться невозможной, но пустые списки подразумевают, что условие не выполняется. Изначально этого не было бы, поскольку добавление вашего массива происходило вне блоков if (из-за проблем с отступами).