Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 9, 2010 21:41:40

BAHbKA
От:
Зарегистрирован: 2010-12-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как перевернуть файл?

Условия: Есть файл или два, по желанию того, кто будет делать. Запускаем файл проги через командную строку и там же указываем через пробелы входной и выходной файлы.

Задача: Программа должна полностью перевернуть файл.

Важно (!): переворачиваться должны и большие файлы тоже.

Вот мои наработки:

#!/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)

Офлайн

#2 Дек. 10, 2010 00:46:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9749
Репутация: +  843  -
Профиль   Отправить e-mail  

Как перевернуть файл?

s=f1.readline()
а причём тут readline()
файл нужно открывать в бинарном режиме и читать его read'ами

это во втором питоне
>>> 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)

Офлайн

#3 Дек. 10, 2010 10:58:45

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Как перевернуть файл?

Вот по виду то, что вам нужно: http://code.activestate.com/recipes/120686-read-a-text-file-backwards/



Офлайн

#4 Дек. 10, 2010 13:32:12

BAHbKA
От:
Зарегистрирован: 2010-12-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как перевернуть файл?

py.user.next. Проблема в том, что мы переворачиваем не линию или небольшой текст, как получается у Вас, а именно файл. Я пытался читать линию и сразу ее переворачивая пихать в стек, а затем из стека перепихивать все в новый файл уже перевернутый порядок строк.
Смотрим на Ваше предложение. В b просто напросто не влезет весь файл. Если он большой, а это-основная идея.

Ed, похоже на то, что надо, только чересчур сложно. Мы просто еще такое не прошли (а в решении похоже создаются классы) и если я это притащу преподу, то ничего хорошего ждать не придется. Я попытаюсь пока, что как то упростить то, что там написано, но если у кого то будет предложение решения проблемы, то я с удовольствием выслушаю. Еще раз спасибо всем, кто пытается мне помочь.

Ed, проверил. Похоже эта прога не переворачивает файл, а проверяет файл на целостность сзади к началу.



Отредактировано (Дек. 10, 2010 13:47:30)

Офлайн

#5 Дек. 10, 2010 14:16:42

BAHbKA
От:
Зарегистрирован: 2010-12-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как перевернуть файл?

Короче я тут помудрил и почитал еще и написал такую хрень:

#!/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)

Офлайн

#6 Дек. 10, 2010 14:28:17

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Как перевернуть файл?

честно говоря тут вы сами ничего не сделали, лишь использовали 2 стандартных функции для переворота файла и строки, не знаю устроит ли это препода. Да еще и в функции накосячили, вместо f1 написав sys.argv.



Офлайн

#7 Дек. 10, 2010 14:48:00

BAHbKA
От:
Зарегистрирован: 2010-12-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как перевернуть файл?

О! Спасибо. Точно. Ошибочка. Сейчас поправлю. Может я и ничего и не написал нового, но пока препод не наругал мои кривые руки этот вариант - самый рабочий из предложенных тут) Если Вы можете и желаете помочь мне, то с удовольствием приму помощь и предложение по улучшению программы)



Отредактировано (Дек. 10, 2010 14:50:53)

Офлайн

#8 Дек. 10, 2010 15:23:03

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Как перевернуть файл?

BAHbKA
Ed, похоже на то, что надо, только чересчур сложно.
Там кода на страничку. Ничего сложного там нет - файл читается с конца, что позволяет обрабатывать очень большие файлы, в отличие от вашего кода, где файл целиком зачитывается в память. Попробуйте напрячься и понять код. Если что-то будет непоняно - задавайте вопросы.

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



Офлайн

#9 Дек. 10, 2010 15:37:55

BAHbKA
От:
Зарегистрирован: 2010-12-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как перевернуть файл?

Ed, не, я понял, что если прога читает файл с конца, то ничего не помешает и записать, но разобраться как поменять прогу для этого я с моими “куриными” мозгами так и не смог, поэтому пришлось идти через лес( Ну не понимаю я пока, что как работать с созданием новых классов( Как записать я знаю, но не смог как следует разобраться в самой проге. Что там и где конкретно делается. А так, как разобраться не смог, то и понять куда именно запихнуть строку вывода - не знаю(



Офлайн

#10 Дек. 10, 2010 23:13:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9749
Репутация: +  843  -
Профиль   Отправить e-mail  

Как перевернуть файл?

BAHbKA
Смотрим на Ваше предложение. В b просто напросто не влезет весь файл. Если он большой, а это-основная идея.
py.user.next
файл нужно открывать в бинарном режиме и читать его read'ами
то есть это значит, что файл читается по блокам, блоки переворачиваются и добавляются в стек
а переворачиваются они тем способом

а не вот этим
        for k in range(0,len(s)):
##По очереди добавляем каждый элемент строки в начало
p=s[k]+p
блоки могут быть большими, в отличие от строк
зачем её добавлять в стек, если у неё длина там три символа
единственный минус в том, что файл будет читаться в список весь, но это твой метод изначальный



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version