Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.85
you_fail_me
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
#1

Обработчик текстовых файлов на Python - Python

16.02.2012, 18:07. Просмотров 5443. Ответов 36
Метки нет (Все метки)

В общем мне нужно создать скрипт, который обрабатывал бы кучу (21 если точнее) текстовых файлов с названиями типа "xxx-000.in" где xxx - постоянно, а 000 - номер, свое для каждого файла, выбирал бы оттуда нужные значения, и записывал бы их правильным образом ( в нужном порядке и с некоторыми преобразованиями) в выходной файл. Я новичек поэтому прошу совета и обьяснения, как это можно реализовать... Особо непонятно мне как начать скрипт - т.е. как прописать с помощью какого-то цикла (я так полагаю) чтобы считывались все файлы имеющие определенные названия описанного выше типа...
Также буду благодарен за совет по поводу можно ли (и не является ли это маразмом) вызвать из пайтоновского скрипта AWK.
http://www.cyberforum.ru/python/thread1760128.html

В частности не понимаю, как обозначить часть имени файла в качестве переменной и запустить цикл по именам файлов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2012, 18:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обработчик текстовых файлов на Python (Python):

Сравнение содержания двух текстовых файлов
Подскажите пожалуйста.как сравнить два файла в не зависимости от порядка слов в...

Склейка нескольких текстовых файлов в один
Подскажите пожалуйста! Есть 4 файла текстовых 1.txt, 2.txt, 3.txt и 4.txt как...

скрипт сравнения двух текстовых файлов
Доброго времени суток! помогите с задачкой на Питоне пожалуйста... Суть задачи...

Обработка текстовых файлов (логов) больших размеров
Добрый день. Хочу написать "обработчик" текстовых логов. Логи очень большие...

Компиляция python файлов
Как лучше компилировать python файлы в exe? И можно ли сделать так, что бы...

36
you_fail_me
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
21.02.2012, 16:00  [ТС] #21
Спасибо за подробный ответ!

Добавлено через 5 минут
А кодировка здесь имеет принципиальную важность или просто так?
Я про
Python
1
with open(filename, 'r', encoding='utf-8') as file:
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
21.02.2012, 16:04 #22
Цитата Сообщение от you_fail_me Посмотреть сообщение
А кодировка здесь имеет принципиальную важность или просто так?
тебе нужно передавать фунции open именно ту кодировку, в которой у тебя сохранен файл, иначе будет ошибка
0
you_fail_me
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
21.02.2012, 16:14  [ТС] #23
Цитата Сообщение от Nameless One Посмотреть сообщение
тебе нужно передавать фунции open именно ту кодировку, в которой у тебя сохранен файл, иначе будет ошибка
Просто блок «encoding», насколько я знаю, необязательный, можно пропускать если нету специфической потребности… Не так? Что я недопонимаю?
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
21.02.2012, 16:15 #24
you_fail_me, да, можно, тогда будет использоваться системная кодировка
1
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
22.02.2012, 02:01 #25
Цитата Сообщение от Nameless One Посмотреть сообщение
тогда будет использоваться системная кодировка
которая непредсказуемая
нигде не написано, что кодировка на такой-то системе должна быть такой-то
в dip3 использование open() в третьем питоне описано
0
you_fail_me
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
23.02.2012, 02:12  [ТС] #26
Новый вопрос: в ходе работы над данным скриптом мне понадобилось написать функцию для решения системы из трех уравнений методом Гаусса, начал писать и столкнулся с непоняткой — в учебнике написано, что элементы списков можно заменять, но вот такой вот цикл у меня почему-то делит не все элементы матрицы на первый элемент их строки, а только первые элементы каждой строки на самих себя:
Python
1
2
3
4
5
def gauss(array):
    for i in range(len(array)):
        for j in range(len(array[i])):
            array[i][j] = float(array[i][j])/(array[i][0])
    return array
Подскажите, пожалуйста, что я делаю не так, и как надо

Добавлено через 1 час 48 минут
Заметил также что имея цикл например
Python
1
2
for i in range(len(array)):
        for j in range(len(array[i])):
если после этих for писать подряд все действия которые нужно совершить над элементами списка то получаются некорректные результаты. Записи после for обрабатываются не просто подряд? Если нужно совершить какое-то преобразование над массивом, после того как завершится предыдущее преобразование надо начинать новый цикл? Или ошибка где-то в другом месте?
0
pyuser
209 / 194 / 63
Регистрация: 26.05.2011
Сообщений: 363
23.02.2012, 10:01 #27
Здесь решение системы линейных уравнений методом Крамера, определитель матрицы считается методом Гауса - попробуйте адаптировать этот код под Ваши нужды
ЗЫ. Входной файл - файл, который Вы выкладывали.
1
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
23.02.2012, 11:03 #28
Цитата Сообщение от pyuser Посмотреть сообщение
решение системы линейных уравнений методом Крамера
метод Крамера гораздо легче сделать, и применим он не к любой системе (количество строк должно равняться количеству переменных)
0
you_fail_me
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
24.02.2012, 02:27  [ТС] #29
Ну как написать я представляю, мой вопрос был вообще о циклах — что например в первом отрывке кода выходит так что во втором вложенном цикле не воспринимается переменная і, определенная до него…
А на примере второго отрывка хотел узнать, можно ли, если условия отбора цикла позволяют, в цикле писать подряд всю последовательность действий над элементами массива, или же если нужно совершить какое-то преобразование над массивом, после того как завершится предыдущее преобразование надо начинать новый цикл.

Добавлено через 2 часа 4 минуты
Написал функцию для метода Гаусса, смотрю — написано все вроде бы правильно, заданы нужные операции, а числа выводит не те( Матрицу к треугольному виду приводит, но коэффициенты почему-то другие (не сходится с тем что сам на бумажке посчитал).
Подскажите, пожалуйста, в чем косяк.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
a11 = 1
a12 = 2
a13 = -1
a14 = 12
#
a21 = 3
a22 = -1
a23 = 4
a24 = -13
#
a31 = -1
a32 = 5
a33 = -1
a34 = 27
#
array = [[a11, a12, a13, a14],
         [a21, a22, a23, a24],
         [a31, a32, a33, a34]]          
def gauss(array):
    for i in range(len(array)):
        for j in range(len(array[i])):
            array[1][j] = float(array[1][j]-(array[0][j]*(array[1][0]/array[0][0])))
            array[2][j] = float(array[2][j]-(array[0][j]*(array[2][0]/array[0][0])))
    for i in range(len(array)):
        for j in range(len(array[i])):
            array[2][j] = float(array[2][j]-array[1][j]*(array[2][1]/array[1][1]))
    z = array[2][3]/array[2][2]
    y = (array[1][3]-array[1][2]*z)/array[1][1]
    x = (array[0][3]-array[0][2]*z-array[0][1])*y/array[0][0]            
    return array, [x, y, z]
Если что алгоритм такой — приводим матрицу к треугольному виду(т.е когда в третьей строке первые два члена — нули, во второй строке — первый член ноль, а первая строка без изменений, находим z из 3й строки, подставляем во вторую — находим у, подставляем z и y в первую — находим х.
К треугольному виду приводится путем элементарных преобразований: вычитаем из второй строки первую, умноженную на (а21/а11), вычитаем из третьей строки первую, умноженную на (а31/а11), затем после этого вычитаем из третьей строки вторую, умноженную на(а32/а22).

Добавлено через 2 часа 20 минут
Увидел закономерность — обрабатываются почему-то только первые значения в строке матрицы, т.е приведенная функция в таком ее виде с приведенными начальными условиями возвращает следующую матрицу:
Python
1
[[1, 2, -1, 12], [0, -1, 4, -13], [0.0, 0.0, -1.0, 27.0]]
0
pyuser
209 / 194 / 63
Регистрация: 26.05.2011
Сообщений: 363
24.02.2012, 04:48 #30
Добавил решение методом Гауса.
1
you_fail_me
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
24.02.2012, 15:27  [ТС] #31
А можете для понимания объяснить, почему нужно прибегать к кортежам, почему со списками не работает?
0
pyuser
209 / 194 / 63
Регистрация: 26.05.2011
Сообщений: 363
25.02.2012, 03:47 #32
Со списками - работает . Кортеж выбран потому, что нет необходимости изменять какой либо элемент строки, строка заменяется новым объектом. Кортеж - объект не изменяемый, соответственно выделение ресурсов для него происходит несколько быстрее чем выделение ресурсов для списка, т.е. в данном конкретном случае использование кортежа можете считать некоего рода оптимизацией.

Код, который я привел - для третьего питона. Во второй ветке функция map возвращает список, а не генератор, поэтому во второй ветке вызов функции tuple избыточен и будет замедлять выполнение.
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
25.02.2012, 07:05 #33
Цитата Сообщение от pyuser Посмотреть сообщение
Код, который я привел - для третьего питона.
в третьем питоне файл должен открываться с кодировкой
0
pyuser
209 / 194 / 63
Регистрация: 26.05.2011
Сообщений: 363
25.02.2012, 14:29 #34
Цитата Сообщение от accept Посмотреть сообщение
в третьем питоне файл должен открываться с кодировкой
Ну Вы же наверняка видели исходный файл - там не важна кодировка, кодировка системы по умолчанию... в любой системе... сбоев не будет
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
26.02.2012, 09:48 #35
вообще, система может не иметь решений, может иметь одно решение или иметь множество решений
кодировка нужна, чтобы не было ситуации, когда файл может неправильно раскодироваться (даже исключения не возникнет)
то, что там цифры сейчас, ещё не значит, что они там будут всегда
0
you_fail_me
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
27.02.2012, 19:13  [ТС] #36
Подскажите пожалуйста лаконичный и удобный метод вывода списка — есть список чисел, допустим, 3 строки 9 столбцов, его нужно в таком виде и вывести но отформатировав каждое число в экспоненциальную форму с шестью знаками после запятой. Не могу никак придумать это хорошо и лаконично сделать, циклом каким-нибудь, чтобы не составлять вручную индивидуально каждую строку и потом подряд их печатать.
0
pyuser
209 / 194 / 63
Регистрация: 26.05.2011
Сообщений: 363
28.02.2012, 02:38 #37
Python
1
2
m = [(1, 2, 3, 4, 5), (6, 7, 8, 9, 10), (11, 12, 13, 14, 15)]
any(print(" ".join("{:06E}".format(y) for y in x)) for x in m)
1
28.02.2012, 02:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2012, 02:38
Привет! Вот еще темы с решениями:

Python и парсинг owl-файлов
Всем доброго времени суток. Стоит следующая задача. Есть файл, который был...

Python и анализ файлов doc и docx
Есть много файлов doc и docx, созданных в Microsoft Office 2007 и выше. В...

Построение графика из txt файлов на Python
Здравствуйте, проблема в следующем: У меня есть два текстовых файла temp.txt и...

Как парсить несколько файлов с Python-скриптом?
Всем доброго времени суток. У меня возникла такая проблема и одновременно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru