как перебирать файлы в python и экспортировать несколько выходных файлов

#python #arrays #numpy #file

#python #массивы #numpy #файл

Вопрос:

У меня есть код, и я хочу поместить его в цикл for . Я хочу ввести в свой код некоторые данные, хранящиеся в виде файлов, и на основе каждого ввода автоматически генерировать выходные данные. На данный момент мой код работает только для одного входного файла и, следовательно, выдает один результат. Мой входной файл назван как model000.msh , но факт в том, что у меня есть серия этих входных файлов с именами model000.msh , model001.msh , и так далее. В коде я выполняю некоторые вычисления для импортированного файла и, наконец, сравниваю его с массивом numpy ( my_data ), который генерируется другим массивом numpy ( ID ), имеющим один столбец и тысячи строк. ID array — это вторая переменная, которую я хочу перебрать. ID выполняется с my_data помощью np.concatenate функции. Я хочу использовать каждый столбец ID to make my_data ( my_data=np.concatenate((ID[:,iterator], gr), axis =1) ) . Итак, я хочу перебрать несколько файлов, затем извлечь массивы из каждого файла ( extracted ), затем выполнить цикл с генерацией my_data из каждого столбца ID и выполнить вычисления my_data и extracted , наконец, экспортировать результаты каждой итерации с помощью метода динамического именования ( changed_000 , changed_001 и так далее). Это мой код для одного единственного ввода и одного единственного my_data массива (созданный с помощью ID , который имеет только один столбец), но я хочу изменить итерацию по нескольким входным файлам и нескольким my_data массивам и, наконец, несколько выходных данных:

 from itertools import islice
with open('model000.msh') as lines:
        nodes = np.genfromtxt(islice(lines, 0, 1000))
with open('model000.msh', "r") as f:
    saved_lines = np.array([line.split() for line in f if len(line.split()) == 9])
saved_lines[saved_lines == ''] = 0.0
elem = saved_lines.astype(np.int)
# following lines extract some data from my file
extracted=np.c_[elem[:,:-4], nodes[elem[:,-4]-1, 1:], nodes[elem[:,-3]-1, 1:],nodes[elem[:,-2]-1, 1:], nodes[elem[:,-1]-1, 1:]]
…
extracted =np.concatenate((extracted, avs), axis =1) # each input file ('model000.msh') will make this numpy array
# another data set, stored as a numpy array is compared to the data extracted from the file
ID= np.array [[… ..., …, …]] # now, it is has one column, but it should have several columns and each iteration, one column will make a my_data array
my_data=np.concatenate((ID, gr), axis =1) # I think it should be something like my_data=np.concatenate((ID[:,iterator], gr), axis =1)
from scipy.spatial import distance
distances=distance.cdist(extracted [:,17:20],my_data[:,1:4])
ind_min_dis=np.argmin(distances, axis=1).reshape(-1,1)
z=np.array([])
for i in ind_min_dis:
    u=my_data[i,0]
    z=np.array([np.append(z,u)]).reshape(-1,1)
final_merged=np.concatenate((extracted,z), axis =1)
new_vol=final_merged[:,-1].reshape(-1,1)
new_elements=np.concatenate((elements,new_vol), axis =1)
new_elements[:,[4,-1]] = new_elements[:,[-1,4]]
# The next block is output block
chunk_size = 3
buffer = ""
i = 0
relavent_line = 0
with open('changed_00', 'a') as fout:
    with open('model000.msh', 'r') as fin:
        for line in fin:
            if len(line.split()) == 9:
                aux_string = ' '.join([str(num) for num in new_elements[relavent_line]])
                buffer  = '%sn' % aux_string
                relavent_line  = 1
            else:
                buffer  = line 
            i =1
            if i == chunk_size:
                fout.write(buffer)
                i=0
                buffer = ""
    if buffer:
        fout.write(buffer)
        i=0
        buffer = ""
  

Я заранее признателен за любую помощь.

Ответ №1:

Я не очень уверен в вашем вопросе. Но, похоже, вы просите что-то вроде:

 for idx in range(10):
    with open('changed_{:0>2d}'.format(idx), 'a') as fout:
        with open('model0{:0>2d}.msh'.format(idx), 'r') as fin:
            #read something from fin...
            #calculate something...
            #write something to fout...
  

Если это так, вы можете выполнить поиск str.format() для получения более подробной информации.

Комментарии:

1. Уважаемый @Dipsy, спасибо за ваш отзыв. Я хочу ввести несколько файлов ( model000.msh и так далее), извлечь некоторые данные ( extracted ). Снова создайте массив ( my_data ) из большего массива ( ID ). Сравните my_data extracted и экспортируйте файл ( changed_00 ). Мой код использует его для одного ввода и передает один вывод, но я хочу перебрать несколько входных файлов, а затем экспортировать также несколько файлов.

2. Я думаю, что мой ответ может решить вашу проблему, если вы выполните точно такие же действия для каждого входного файла.

3. Дорогой @Dipsy, я действительно ценю это. Не могли бы вы, пожалуйста, подробнее рассказать об этом. Как я могу перебирать несколько входных файлов, а также генерировать несколько my_data из каждого столбца ID ? Спасибо, что уделили время. Я новичок в python, и мне немного сложно решать такие проблемы.

4. Что касается того, как перебирать несколько входных файлов, я рассказал вам, как использовать for и str.format() открывать разные входные файлы. Что касается вашего data и ID (извините, что я в замешательстве по этому поводу), я думаю, вам следует упростить свой вопрос и создать новую страницу вопросов. Мы не должны читать весь ваш код и рассказывать вам, как это исправить.

5. Дорогой @Dipsy, я ценю ваши информативные подсказки. Я пытаюсь решить эту проблему, используя ваши подсказки и подсказки.