Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 18, 2017 12:57:19

extreems
Зарегистрирован: 2017-02-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как открыть и обработать множество файлов в директории?

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, а не ее название? Во вторых самому кажется, что написано некрасиво. В третьих даже если файлы открою, как грамотно проиндексировать их содержимое? Подскажите как грамотно сделать и где искать )

Офлайн

#2 Фев. 18, 2017 14:59:30

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Как открыть и обработать множество файлов в директории?

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

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



Отредактировано doza_and (Фев. 18, 2017 15:00:19)

Офлайн

#3 Фев. 18, 2017 18:17:49

vk74
Зарегистрирован: 2017-02-18
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Как открыть и обработать множество файлов в директории?

А зачем открывать сразу все файлы?

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

З.Ы. Может будет проще всё загрузить в БД и там уже сиквел запросами обработать?

Офлайн

#4 Фев. 18, 2017 19:38:06

ampermetr
Зарегистрирован: 2016-01-27
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Как открыть и обработать множество файлов в директории?

 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

Офлайн

#5 Фев. 18, 2017 19:42:40

extreems
Зарегистрирован: 2017-02-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как открыть и обработать множество файлов в директории?

Хорошо. Допустим в папке .\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-ной строки, складывать ее и закрывать файл.
Вариант с БД интересен, но наверное уже на следующем этапе )))

Отредактировано extreems (Фев. 18, 2017 19:47:58)

Офлайн

#6 Фев. 18, 2017 21:39:09

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Как открыть и обработать множество файлов в директории?

 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)

Офлайн

#7 Фев. 18, 2017 22:10:02

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Как открыть и обработать множество файлов в директории?

может так?

 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
Если количество строк в файлах разные, то недостающие строки в сложении заменяются нулями.
то есть дописываем в строку недостающие нули. ну а после обрабатываем полученный массив считаем сумму каждого столбца и дописываем результат в новый файл

Отредактировано marvellik (Фев. 18, 2017 22:38:59)

Офлайн

#8 Фев. 19, 2017 08:52:28

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Как открыть и обработать множество файлов в директории?

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)



Отредактировано doza_and (Фев. 19, 2017 08:53:15)

Офлайн

#9 Фев. 19, 2017 09:38:41

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Как открыть и обработать множество файлов в директории?

doza_and
Romissevd marvellik как-то длинновато. Может так:
Незнание не освобождает от ответственности, но скажу в свою защиту, что с pandas не знаком, поэтому вот такой результат.
doza_and Вам respect.

Отредактировано Romissevd (Фев. 19, 2017 09:39:10)

Офлайн

#10 Фев. 20, 2017 14:16:09

extreems
Зарегистрирован: 2017-02-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как открыть и обработать множество файлов в директории?

Спасибо, помогли ) Сейчас разберусь как и добавлю + в репутацию )

Еще один косвенный вопрос (в поиске не нашел).
Когда я с помощью file.readline() считываю строку, у меня сдвигается каретка позицию которую можно посмотреть через file.tell() или обнулить через file.seek(0). Каретка сдвигается и считает символы (байты), а мне нужно считать строки и не через отдельную переменную. Как это лаконичнее всего сделать? Это можно как то узнать через file.tell()?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version