Форум программистов, компьютерный форум, киберфорум
Наши страницы

Python

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

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

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

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

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

Обзор текстовых редакторов для python - Python
Начал изучать Django, раньше писал код в wing ide, pycharm, но не особо доволен, для Django мне пока что только и пригодилась консоль,...

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

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

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

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

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

36
Nameless One
Эксперт С++
5783 / 3432 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
21.02.2012, 03:13 #16
Цитата Сообщение от you_fail_me Посмотреть сообщение
Или есть более лаконичные методы?
str тут в данном случае не нужен, оператор форматирования % сам возвращает строку
Цитата Сообщение от you_fail_me Посмотреть сообщение
Хочу еще также спросить — как заставить glob искать еще и в поддиректориях папки, к которой прописан путь в его аргументе?
вызывай ее вручную для каждой поддиректории директории. Можешь еще посмотреть на os.walk
Цитата Сообщение от you_fail_me Посмотреть сообщение
Читал в сети описания но толкового понимания не обрел( Ктото может доходчиво, «кухонным языком» объяснить?
когда питон читает исходник, он выполняет любой код, который в нем есть. Если он читает (выполняет) некоторый модуль как главную программу, то он устанавливает для переменной __name__ значение '__main__'. Эта особенность позволяет написать код, который будет выполняться только тогда, когда скрипт выполняется как отдельная программа, а не когда импортируется в качестве модуля.
И да, натуральнее будет писать так:
Python
1
if __name__  == "__main__":
Питон это вам не С, в нем нет смысла менять местами переменные и литеральные значения в конструкциях типа if, while, etc.
1
you_fail_me
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
21.02.2012, 11:07  [ТС] #17
Тоесть
Python
1
if __name__  == "__main__":
не делает ничего кроме того что один и тот же код с этой конструкцией будет выполняться только как отдельная программа, а без нее — еще сможет выполняться как импортированный модуль?

Добавлено через 21 минуту
Подскажите пожалуйста, если входной файл достаточно большой,а нужна из него относительно маленькая часть, таким образом грузить его полностью нежелательно, как можно осуществить поиск в духе: «если строка начинается с pattern1, то вывести/добавить в список 5 последующих строк (либо же добавлять последующие строки в список пока не будет достигнута строка, начинающаяся(или полностью равная, тоже можно) с pattern2)»?
0
Nameless One
Эксперт С++
5783 / 3432 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
21.02.2012, 11:10 #18
Цитата Сообщение от you_fail_me Посмотреть сообщение
не делает ничего кроме того что один и тот же код с этой конструкцией будет выполняться только как отдельная программа, а без нее — еще сможет выполняться как импортированный модуль?
нет, это конструкция позволит тебе определить, когда скрипт выполняется как отдельная программа, а когда он импортирован как модуль, и в соответствии с этим производить некоторые действия. Пример: пусть у тебя есть следующий скрипт:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def hello(name):
    print('Hello,', name)
 
if __name__ == '__main__':
    print('Launched as stand-alone script')
 
    from sys import argv, stderr
    try:
        hello(argv[1])
    except IndexError:
        print('Usage: {} NAME'.format(argv[0]), file=stderr)
else:
    print('Imported with __name__ = {}'.format(__name__))
Если ты его запустишь как отдельную программу, то переменная __name__ получит специальное значение '__main__', и выполнятся строки 5-11:
Код
[nameless@desktop python]$ python3 sample.py World
Launched as stand-alone script
Hello, World
[nameless@desktop python]$
Если же ты импортируешь скрипт в интерактивном интерпретаторе, то __name__ получит имя модуля (скрипта), и выполнится строка 13:
Python
1
2
3
4
5
6
7
8
Python 3.2.1 (default, Jul 11 2011, 18:54:42) 
[GCC 4.6.1 20110627 (Red Hat 4.6.1-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sample
Imported with __name__ = sample
>>> sample.hello('you_fail_me')
Hello, you_fail_me
>>>
1
you_fail_me
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
21.02.2012, 15:41  [ТС] #19
Подскажите пожалуйста, если входной файл достаточно большой, а нужна из него относительно маленькая часть, таким образом получается, что грузить его полностью нецелесообразно, как тогда можно осуществить поиск в духе: «если строка начинается с pattern1, то вывести/добавить в список 5 последующих строк (либо же добавлять последующие строки в список пока не будет достигнута строка, начинающаяся(или полностью равная, тоже можно) с pattern2)»?

Добавлено через 1 час 42 минуты
И еще один вопрос — как в шаблоне (для поиска файлов подходящих под шаблон имени) типа "xxx-???.in" задать произвольное количество символов в неизвестном промежутке? Или не совсем произвольное, а «меньше, или равно» или «в диапазоне»? Потому как в такой схеме n вопросительных знаков подразумевают именно n неизвестных символов, что более чем неудобно( (по крайней мере для меня при выполнении текущей задачи).
0
Nameless One
Эксперт С++
5783 / 3432 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
21.02.2012, 15:53 #20
Цитата Сообщение от you_fail_me Посмотреть сообщение
как тогда можно осуществить поиск в духе: «если строка начинается с pattern1, то вывести/добавить в список 5 последующих строк
Python
1
2
3
4
5
6
7
8
9
10
11
12
def process(filename, pattern, count):
    result, found, remaining = [], False, count
    with open(filename, 'r', encoding='utf-8') as file:
        for line in file:
            if found:
                if remaining == 0:
                    break
                result.append(line)
                remaining -= 1
            if line.startswith(pattern):
                found = True
    return result
Пример:
Python
1
2
3
4
5
6
7
>>> print(*sample.process('sample.py', 'def', 5), end='')
    result, found, remaining = [], False, count
     with open(filename, 'r', encoding='utf-8') as file:
         for line in file:
             if found:
                 if remaining == 0:
>>>
Цитата Сообщение от you_fail_me Посмотреть сообщение
либо же добавлять последующие строки в список пока не будет достигнута строка, начинающаяся(или полностью равная, тоже можно) с pattern2
Python
1
2
3
4
5
6
7
8
def process(filename, pattern):
    result = []
    with open(filename, 'r', encoding='utf-8') as file:
        for line in file:
            if line.startswith(pattern):
                break
            result.append(line)
    return result
Цитата Сообщение от you_fail_me Посмотреть сообщение
И еще один вопрос — как в шаблоне (для поиска файлов подходящих под шаблон имени) типа "xxx-???.in" задать произвольное количество символов в неизвестном промежутке?
например, так: "xxx-*.in"

Цитата Сообщение от you_fail_me Посмотреть сообщение
Или не совсем произвольное, а «меньше, или равно» или «в диапазоне»?
Имхо, с помощью Unix shell globs не получится, но можно с помощью регулярных выражений
1
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
Эксперт С++
5783 / 3432 / 255
Регистрация: 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
Эксперт С++
5783 / 3432 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
21.02.2012, 16:15 #24
you_fail_me, да, можно, тогда будет использоваться системная кодировка
1
accept
4832 / 3253 / 165
Регистрация: 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 / 26
Регистрация: 26.05.2011
Сообщений: 363
23.02.2012, 10:01 #27
Здесь решение системы линейных уравнений методом Крамера, определитель матрицы считается методом Гауса - попробуйте адаптировать этот код под Ваши нужды
ЗЫ. Входной файл - файл, который Вы выкладывали.
1
accept
4832 / 3253 / 165
Регистрация: 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 / 26
Регистрация: 26.05.2011
Сообщений: 363
24.02.2012, 04:48 #30
Добавил решение методом Гауса.
1
24.02.2012, 04:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2012, 04:48
Привет! Вот еще темы с ответами:

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

Открытие окон в заданной ориентации+проигрывание медиа-файлов (Python 3) - Python
Нужно создать программу, которая будет открывать несколько окон, подразумевается больше 5, (без рамок, белых полей и т.д.) в заданной...

Какие библиотеки python для преобразования файлов разных типов в xml? - Python
Нужно преобразовать файлы разных типов (html, txt, pdf) в xml.

Python - момент истины. Python - как оружие возмездие против системы - Python
Какие модули в python мне нужны для взлома баз данных? Перехвата информации? Внедрения в систему? Добавлено через 10 минут Хочу...


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

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

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