Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/48: Рейтинг темы: голосов - 48, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
1

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

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

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

В частности не понимаю, как обозначить часть имени файла в качестве переменной и запустить цикл по именам файлов.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2012, 18:07
Ответы с готовыми решениями:

Использование встроенных типов-коллекций и генераторов. Обработка текстовых файлов. Работа с модулями Python
Файл employees.txt имеет следующую структуру: код работника, фамилия, должность, оклад. У файла...

Обработчик текстовых файлов
Добрый день,прошу помощи в этом нелегком(для меня ) задании ! Написать программу-обработчик...

Обработчик текстовых файлов
Написать программу-обработчик текстовых файлов,что б создавала текстовый файл в котором текст...

Обработчик текстовых файлов
Написать программу-обработчик текстовых файлов, что б создавала текстовый файл в котором символы...

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

Добавлено через 5 минут
А кодировка здесь имеет принципиальную важность или просто так?
Я про
Python
1
with open(filename, 'r', encoding='utf-8') as file:
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
21.02.2012, 16:04 22
Цитата Сообщение от you_fail_me Посмотреть сообщение
А кодировка здесь имеет принципиальную важность или просто так?
тебе нужно передавать фунции open именно ту кодировку, в которой у тебя сохранен файл, иначе будет ошибка
0
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
21.02.2012, 16:14  [ТС] 23
Цитата Сообщение от Nameless One Посмотреть сообщение
тебе нужно передавать фунции open именно ту кодировку, в которой у тебя сохранен файл, иначе будет ошибка
Просто блок «encoding», насколько я знаю, необязательный, можно пропускать если нету специфической потребности… Не так? Что я недопонимаю?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
21.02.2012, 16:15 24
you_fail_me, да, можно, тогда будет использоваться системная кодировка
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.02.2012, 02:01 25
Цитата Сообщение от Nameless One Посмотреть сообщение
тогда будет использоваться системная кодировка
которая непредсказуемая
нигде не написано, что кодировка на такой-то системе должна быть такой-то
в dip3 использование open() в третьем питоне описано
0
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
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
23.02.2012, 10:01 27
Здесь решение системы линейных уравнений методом Крамера, определитель матрицы считается методом Гауса - попробуйте адаптировать этот код под Ваши нужды
ЗЫ. Входной файл - файл, который Вы выкладывали.
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
23.02.2012, 11:03 28
Цитата Сообщение от pyuser Посмотреть сообщение
решение системы линейных уравнений методом Крамера
метод Крамера гораздо легче сделать, и применим он не к любой системе (количество строк должно равняться количеству переменных)
0
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
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
24.02.2012, 04:48 30
Добавил решение методом Гауса.
1
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
24.02.2012, 15:27  [ТС] 31
А можете для понимания объяснить, почему нужно прибегать к кортежам, почему со списками не работает?
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
25.02.2012, 03:47 32
Со списками - работает . Кортеж выбран потому, что нет необходимости изменять какой либо элемент строки, строка заменяется новым объектом. Кортеж - объект не изменяемый, соответственно выделение ресурсов для него происходит несколько быстрее чем выделение ресурсов для списка, т.е. в данном конкретном случае использование кортежа можете считать некоего рода оптимизацией.

Код, который я привел - для третьего питона. Во второй ветке функция map возвращает список, а не генератор, поэтому во второй ветке вызов функции tuple избыточен и будет замедлять выполнение.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.02.2012, 07:05 33
Цитата Сообщение от pyuser Посмотреть сообщение
Код, который я привел - для третьего питона.
в третьем питоне файл должен открываться с кодировкой
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
25.02.2012, 14:29 34
Цитата Сообщение от accept Посмотреть сообщение
в третьем питоне файл должен открываться с кодировкой
Ну Вы же наверняка видели исходный файл - там не важна кодировка, кодировка системы по умолчанию... в любой системе... сбоев не будет
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
26.02.2012, 09:48 35
вообще, система может не иметь решений, может иметь одно решение или иметь множество решений
кодировка нужна, чтобы не было ситуации, когда файл может неправильно раскодироваться (даже исключения не возникнет)
то, что там цифры сейчас, ещё не значит, что они там будут всегда
0
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
27.02.2012, 19:13  [ТС] 36
Подскажите пожалуйста лаконичный и удобный метод вывода списка — есть список чисел, допустим, 3 строки 9 столбцов, его нужно в таком виде и вывести но отформатировав каждое число в экспоненциальную форму с шестью знаками после запятой. Не могу никак придумать это хорошо и лаконично сделать, циклом каким-нибудь, чтобы не составлять вручную индивидуально каждую строку и потом подряд их печатать.
0
224 / 209 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2012, 02:38
Помогаю со студенческими работами здесь

Написать программу-обработчик текстовых файлов
Добрый вечер) подскажите пожалуйста, как написать код на эту программу? не понимаю до конца...

Программа-обработчик текстовых файлов, определяющая сумму ASCII-кодов символов в файле
Добрый день! Нужна помощь в решении задачи: 2. Программа-обработчик текстовых файлов,...

Написать обработчик текстовых файлов, что создает текстовый файл в который слова будут написаны наоборот
Написать программу-обработчик текстовых файлов, что создает текстовый файл в который слова будут...

Написать программу - обработчик текстовых файлов, что бы создавала текстовый файл, в котором текст выравнивается за правым краем на заданную ширину си
Написать программу - обработчик текстовых файлов, что бы создавала текстовый файл, в котором текст...

Использование встроенных типов-коллекций и генераторов. Обработка текстовых файлов. Работа с модулями Python
Файл employees.txt имеет следующую структуру: код работника, фамилия, должность и оклад. У файла...

Создание программы с использованием текстовых файлов и файлов записи
Дан текстовый файл в котором хранится информация о 6 спорсменах. В нечетных строчкеах записаны ФИО,...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru