Форум сайта python.su
0
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, а не ее название? Во вторых самому кажется, что написано некрасиво. В третьих даже если файлы открою, как грамотно проиндексировать их содержимое? Подскажите как грамотно сделать и где искать )
Офлайн
253
extreemsЕсли коротко - НИКАК. Много понятие растяжимое. В большинстве ОС количество одновременно открытых файлов сильно ограничено, следовательно все их открыть вы не сможете - операционная система не даст.
Файлов там множество, мне нужно их все открыть
extreemsА как вы узнали? Что должно получиться? Посмотрите что такое with, read, close
Это не работает
Отредактировано doza_and (Фев. 18, 2017 15:00:19)
Офлайн
0
А зачем открывать сразу все файлы?
Опишите, пожалуйста, точно алгоритм того, чего Вам нужно сделать.
А так же выложите, пожалуйста, примеры файлов. :-)
З.Ы. Может будет проще всё загрузить в БД и там уже сиквел запросами обработать?
Офлайн
1
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
Офлайн
0
Хорошо. Допустим в папке .\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]
Отредактировано extreems (Фев. 18, 2017 19:47:58)
Офлайн
76
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)
Офлайн
73
может так?
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)
extreemsто есть дописываем в строку недостающие нули. ну а после обрабатываем полученный массив считаем сумму каждого столбца и дописываем результат в новый файл
Если количество строк в файлах разные, то недостающие строки в сложении заменяются нулями.
Отредактировано marvellik (Фев. 18, 2017 22:38:59)
Офлайн
253
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)
Офлайн
76
doza_andНезнание не освобождает от ответственности, но скажу в свою защиту, что с pandas не знаком, поэтому вот такой результат.
Romissevd marvellik как-то длинновато. Может так:
Отредактировано Romissevd (Фев. 19, 2017 09:39:10)
Офлайн
0
Спасибо, помогли ) Сейчас разберусь как и добавлю + в репутацию )
Еще один косвенный вопрос (в поиске не нашел).
Когда я с помощью file.readline() считываю строку, у меня сдвигается каретка позицию которую можно посмотреть через file.tell() или обнулить через file.seek(0). Каретка сдвигается и считает символы (байты), а мне нужно считать строки и не через отдельную переменную. Как это лаконичнее всего сделать? Это можно как то узнать через file.tell()?
Офлайн