Найти - Пользователи
Полная версия: Как открыть и обработать множество файлов в директории?
Начало » Python для новичков » Как открыть и обработать множество файлов в директории?
1 2
extreems
import os
path = os.getcwd() + ‘\\test’

for name in os.listdir(path):
files = os.path.join(path, name)

В переменной files у меня список с названиями файлов из директории path
Файлов там множество, мне нужно их все открыть и обработать (взять и сложить числа из каждой строчки и определенных колонок). Споткнулся, что не могу открыть файлы и проиндексировать их в переменной.

n = 0
For name in files:
f(n) = open(name,'r')
n=n+1

Это не работает ( Во первых как взять содержимое name в функции open, а не ее название? Во вторых самому кажется, что написано некрасиво. В третьих даже если файлы открою, как грамотно проиндексировать их содержимое? Подскажите как грамотно сделать и где искать )
doza_and
extreems
Файлов там множество, мне нужно их все открыть
Если коротко - НИКАК. Много понятие растяжимое. В большинстве ОС количество одновременно открытых файлов сильно ограничено, следовательно все их открыть вы не сможете - операционная система не даст.

Более того, если файлы большие то и считать их не получится, оперативной памяти не хватит.
extreems
Это не работает
А как вы узнали? Что должно получиться? Посмотрите что такое with, read, close
А что такое проиндексировать так это вообще непонятно.
vk74
А зачем открывать сразу все файлы?

Опишите, пожалуйста, точно алгоритм того, чего Вам нужно сделать.
А так же выложите, пожалуйста, примеры файлов. :-)

З.Ы. Может будет проще всё загрузить в БД и там уже сиквел запросами обработать?
ampermetr
 import os
def sum():
    path = input ("Enter path")
    list_of_files = []
    x = 0
    for name in os.listdir(path):
        list_of_files.append(path + '/' + name)
    for item in list_of_files:
        file = open (item, 'r')
        for line in file:
            x += int(line.strip('\n').split(" ")[0])
        file.close()
    return x
extreems
Хорошо. Допустим в папке .\test находится сотня-другая файлов, для упрощения текстовые *.txt
Пусть в каждом из файлов одна колонка цифр. Задача создать новый файл, где в каждой n-ной строчке будет сумма n-ных строк из каждого файла.

Например в файле 1.txt будет столбец
334
56
787
-34

В файле 2.txt
758
32
68.43

В файле xyz.txt
34
257
-76.2


В итоговом файле в первой строке должна быть сумма 334+758+…+34
Во второй строке сумма 56+32+…+257
SumFile[row n] = 1.txt[row n]+2.txt[row n]+...xyz.txt[row n]
Если количество строк в файлах разные, то недостающие строки в сложении заменяются нулями.

И конечно же вы правы, нет смысла открывать все файлы сразу. Нужно открывать файлы поочередно, брать необходимую цифру для каждой n-ной строки, складывать ее и закрывать файл.
Вариант с БД интересен, но наверное уже на следующем этапе )))
Romissevd
 lst_file = ['2.txt', '3.txt']
lst_res = []
for f in lst_file:
    with open(f, 'r') as file_txt:
        for index, line in enumerate(file_txt):
            try:
                lst_res[index] = int(line) + int(lst_res[index])
            except IndexError:
                lst_res.append(line)
            except ValueError:
                lst_res[index] = float(line) + float(lst_res[index])
with open('res.txt', 'w') as res:
    for value in lst_res:
        s = str(value) + '\n'
        res.write(s)
marvellik
может так?
 import os
path = input()
list_file = os.listdir(path)
list_data = []
for i in list_file:
    file = '{}\{}'.format(path,i)
    with open(file) as inp:
        list_data.append (list(map(float,inp.read().split())))
max_len = len(max(list_data, key = len))
for i,x in enumerate(list_data):
    if len (x) != max_len:
        list_data[i] += [0 for _ in range(max_len-len (x))]
        
for i in range(max_len):
    sum_el = sum([list_data[j][i] for j in range(len(list_data))])
    print(sum_el)

теперь в мaссиве list_data все данные из фалов то есть списки строк из файлов. находим самый длинный список и от него танцуем по условию
extreems
Если количество строк в файлах разные, то недостающие строки в сложении заменяются нулями.
то есть дописываем в строку недостающие нули. ну а после обрабатываем полученный массив считаем сумму каждого столбца и дописываем результат в новый файл
doza_and
Romissevd marvellik как-то длинновато. Может так:
 import pandas as pd
import glob
files=glob.glob("*.txt")
d=pd.read_csv(files[0],header=None)
for i in files[1:]:
    d=d.add(pd.read_csv(i,header=None),fill_value=0)
print(d)
Romissevd
doza_and
Romissevd marvellik как-то длинновато. Может так:
Незнание не освобождает от ответственности, но скажу в свою защиту, что с pandas не знаком, поэтому вот такой результат.
doza_and Вам respect.
extreems
Спасибо, помогли ) Сейчас разберусь как и добавлю + в репутацию )

Еще один косвенный вопрос (в поиске не нашел).
Когда я с помощью file.readline() считываю строку, у меня сдвигается каретка позицию которую можно посмотреть через file.tell() или обнулить через file.seek(0). Каретка сдвигается и считает символы (байты), а мне нужно считать строки и не через отдельную переменную. Как это лаконичнее всего сделать? Это можно как то узнать через file.tell()?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB