Перебрать все файлы в каталоге и получить среднее значение из каждого файла - PullRequest
0 голосов
/ 12 октября 2019

У меня есть несколько файлов в каталоге, и я хотел бы напечатать в файл средние значения первого и последнего числа в первом столбце из всех файлов. Как это сделать, пожалуйста?

Этот код не завершен:

# giving names of all files in a directory to the file files.txt - OK
import os
files = os.listdir("/media/linux/DATADISK")

with open('files.txt', 'w') as f:
    for item in files:
        f.write("%s\n" % item)

# loading the first column of all files into lists or dataframes with the name/key according files.txt and save average value to file average.txt
for i in files:
    np.loadtext(f'   .  ', unpack=True, usecols=[0]))
    average = (list[0]+list[-1])/2
    print(average, , file=open("average.txt","a"))

Я не знаю, как написать второй for цикл, который должен загружать файл (1-й столбец),вычислить среднее из последнего и первого значений и записать его в файл. Это должно сделать это для всех файлов в каталоге. Я не знаю, как писать имена файлов - они имеют разные имена и одинаковое расширение.

Например, в каталоге 2 файла: klj.txt и gdf.dat

klj.txt

4 6 
6 5  
6 1

gdf.dat

4 5
2 0
8 1

Выходной файл Average.txt должен быть:

5 
6

1 Ответ

1 голос
/ 12 октября 2019

Прежде всего, вам не нужен отдельный цикл, который записывает файлы в files.txt . Вы можете выполнить всю операцию как часть цикла os.listdir. Вам просто нужно сформировать полный путь к каждому файлу (путь, который вы должны передать np.loadtxt позже). Например:

import os
data_path = os.path.abspath("/media/linux/DATADISK")

for f in os.listdir(data_path):
    f_path = os.path.join(data_path, f)
    print(f_path)

# Output:
# /media/linux/DATADISK/gdf.dat
# /media/linux/DATADISK/klj.txt

Затем вы можете использовать параметр delimiter np.loadtxt, чтобы указать, что каждая строка каждого файла отделяется пробелом. Параметр usecols, который вы вводите, уже верен, если вас интересует только 1-й столбец.

data = np.loadtxt(f_path, delimiter=' ', usecols=0)
print(data)

# Output:
# /media/linux/DATADISK/gdf.dat
# [4. 2. 8.]
# /media/linux/DATADISK/klj.txt
# [4. 6. 6.]

Тогда у вас уже была правильная средняя часть кода. Но я бы порекомендовал сначала открыть файл average.txt , чтобы вам не нужно было open его в каждом цикле.

with open("average.txt", "a") as output:
    for f in os.listdir(data_path):
        ...
        average = (data[0] + data[-1]) / 2
        output.write(str(average) + "\n")

Соберите все вместе:

import numpy as np
import os
data_path = os.path.abspath("/media/linux/DATADISK")

with open("average.txt", "a") as output:
    for f in os.listdir(data_path):
        f_path = os.path.join(data_path, f)
        data = np.loadtxt(f_path, delimiter=' ', usecols=0)
        average = (data[0] + data[-1]) / 2
        output.write(str(average) + "\n")

Образец average.txt :

6.0
5.0

Порядок будет зависеть от возврата os.listdir, поэтому gdf.bat будет обработано до klj.txt .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...