Форум сайта python.su
Условия: Есть файл или два, по желанию того, кто будет делать. Запускаем файл проги через командную строку и там же указываем через пробелы входной и выходной файлы.
Задача: Программа должна полностью перевернуть файл.
Важно (!): переворачиваться должны и большие файлы тоже.
Вот мои наработки:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
def create_stack():
"""Создать стек"""
return []
def delete_stack(Stack):
"""Удалить стек"""
return None
def is_empty(Stack):
"""Проверка пустоты стека"""
return len(Stack) == 0
def push(Stack, item):
"""Поместить новый элемент в стек"""
Stack.append(item)
def pop(Stack):
"""Снять верхний элемента со стека"""
return Stack.pop()
##Создаем стек
stack=create_stack()
##Хватает ли аргументов? Если да, то выполняем программу...
if len(sys.argv)==3:
##Открываем файл для чтения
f1=open(sys.argv[1], 'r')
##Открываем файл для записи
f2=open(sys.argv[2], 'w')
##Делаем переменную, которая будет проверять закончился ли файл
s=True
while s:
##Делаем пустую (чистим) переменную, в которую будем пихать перевернутую строку
p=''
##Читаем из файла строку
s=f1.readline()
for k in range(0,len(s)):
##По очереди добавляем каждый элемент строки в начало
p=s[k]+p
##Пихаем перевернутую строку в стек
push(stack,p)
#Теперь по очереди помещаем элементы стека во второй файл, пока стек не опустеет#
while is_empty(stack)==False:
f2.write(pop(stack))
##Если не хватает, то объясняем как записывать
else:
print 'Forma zaprosa: rev.py otkuda kuda'
Отредактировано (Дек. 9, 2010 21:42:59)
Офлайн
s=f1.readline()
>>> b = 'abcd'
>>> r = ''.join(c for c in reversed(b))
>>> b
'abcd'
>>> r
'dcba'
>>>
>>> b = "abcd"
>>> b
'abcd'
>>> r = b[::-1]
>>> r
'dcba'
>>>
Отредактировано (Дек. 10, 2010 07:03:34)
Офлайн
Вот по виду то, что вам нужно: http://code.activestate.com/recipes/120686-read-a-text-file-backwards/
Офлайн
py.user.next. Проблема в том, что мы переворачиваем не линию или небольшой текст, как получается у Вас, а именно файл. Я пытался читать линию и сразу ее переворачивая пихать в стек, а затем из стека перепихивать все в новый файл уже перевернутый порядок строк.
Смотрим на Ваше предложение. В b просто напросто не влезет весь файл. Если он большой, а это-основная идея.
Ed, похоже на то, что надо, только чересчур сложно. Мы просто еще такое не прошли (а в решении похоже создаются классы) и если я это притащу преподу, то ничего хорошего ждать не придется. Я попытаюсь пока, что как то упростить то, что там написано, но если у кого то будет предложение решения проблемы, то я с удовольствием выслушаю. Еще раз спасибо всем, кто пытается мне помочь.
Ed, проверил. Похоже эта прога не переворачивает файл, а проверяет файл на целостность сзади к началу.
Отредактировано (Дек. 10, 2010 13:47:30)
Офлайн
Короче я тут помудрил и почитал еще и написал такую хрень:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
def reverse(f1,f2):
## Считываем файл задом наперед
for line in reversed(f1.readlines()):
## Переворачиваем считанную строку и пихаем во второй файл
f2.write(line[::-1])
##Хватает ли аргументов? Если да, то выполняем программу...
if len(sys.argv)==3:
##Передаем в функцию переворота файлы
reverse(open(sys.argv[1], 'r'),open(sys.argv[2], 'w'))
##Если не хватает, то объясняем как записывать
else:
print 'Forma zaprosa: rev.py otkuda kuda'
Отредактировано (Дек. 10, 2010 14:48:12)
Офлайн
честно говоря тут вы сами ничего не сделали, лишь использовали 2 стандартных функции для переворота файла и строки, не знаю устроит ли это препода. Да еще и в функции накосячили, вместо f1 написав sys.argv.
Офлайн
О! Спасибо. Точно. Ошибочка. Сейчас поправлю. Может я и ничего и не написал нового, но пока препод не наругал мои кривые руки этот вариант - самый рабочий из предложенных тут) Если Вы можете и желаете помочь мне, то с удовольствием приму помощь и предложение по улучшению программы)
Отредактировано (Дек. 10, 2010 14:50:53)
Офлайн
BAHbKAТам кода на страничку. Ничего сложного там нет - файл читается с конца, что позволяет обрабатывать очень большие файлы, в отличие от вашего кода, где файл целиком зачитывается в память. Попробуйте напрячься и понять код. Если что-то будет непоняно - задавайте вопросы.
Ed, похоже на то, что надо, только чересчур сложно.
проверил. Похоже эта прога не переворачивает файл, а проверяет файл на целостность сзади к началу.Плохо проверили. Там есть все, чтобы читать файл построчно задом наперед. А уж как записать то, что прочитали я думаю вы уж сами догадаетесь. Ну а не догадаетесь - так тому и быть :)
Офлайн
Ed, не, я понял, что если прога читает файл с конца, то ничего не помешает и записать, но разобраться как поменять прогу для этого я с моими “куриными” мозгами так и не смог, поэтому пришлось идти через лес( Ну не понимаю я пока, что как работать с созданием новых классов( Как записать я знаю, но не смог как следует разобраться в самой проге. Что там и где конкретно делается. А так, как разобраться не смог, то и понять куда именно запихнуть строку вывода - не знаю(
Офлайн
BAHbKA
Смотрим на Ваше предложение. В b просто напросто не влезет весь файл. Если он большой, а это-основная идея.
py.user.nextто есть это значит, что файл читается по блокам, блоки переворачиваются и добавляются в стек
файл нужно открывать в бинарном режиме и читать его read'ами
for k in range(0,len(s)):
##По очереди добавляем каждый элемент строки в начало
p=s[k]+p
Офлайн