Найти - Пользователи
Полная версия: Как перевернуть файл?
Начало » Центр помощи » Как перевернуть файл?
1 2
BAHbKA
Условия: Есть файл или два, по желанию того, кто будет делать. Запускаем файл проги через командную строку и там же указываем через пробелы входной и выходной файлы.

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

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

Вот мои наработки:
#!/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'
Проблема в том, что мой вариант не переворачивает большие файлы, а маленькие малость кривовато.
Желательно сделать так, чтобы использовались абстрактные типы данных типа стека, но чтобы были реализованы вот как у меня в наработках.
Заранее спасибо.
py.user.next
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'
>>>
Ed
Вот по виду то, что вам нужно: http://code.activestate.com/recipes/120686-read-a-text-file-backwards/
BAHbKA
py.user.next. Проблема в том, что мы переворачиваем не линию или небольшой текст, как получается у Вас, а именно файл. Я пытался читать линию и сразу ее переворачивая пихать в стек, а затем из стека перепихивать все в новый файл уже перевернутый порядок строк.
Смотрим на Ваше предложение. В b просто напросто не влезет весь файл. Если он большой, а это-основная идея.

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

Ed, проверил. Похоже эта прога не переворачивает файл, а проверяет файл на целостность сзади к началу.
BAHbKA
Короче я тут помудрил и почитал еще и написал такую хрень:
#!/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'
Завтра препод проверит и я напишу результат. Если все будет правильно, то хорошо) Может еще кому то понадобится эта прога)
Zubchick
честно говоря тут вы сами ничего не сделали, лишь использовали 2 стандартных функции для переворота файла и строки, не знаю устроит ли это препода. Да еще и в функции накосячили, вместо f1 написав sys.argv.
BAHbKA
О! Спасибо. Точно. Ошибочка. Сейчас поправлю. Может я и ничего и не написал нового, но пока препод не наругал мои кривые руки этот вариант - самый рабочий из предложенных тут) Если Вы можете и желаете помочь мне, то с удовольствием приму помощь и предложение по улучшению программы)
Ed
BAHbKA
Ed, похоже на то, что надо, только чересчур сложно.
Там кода на страничку. Ничего сложного там нет - файл читается с конца, что позволяет обрабатывать очень большие файлы, в отличие от вашего кода, где файл целиком зачитывается в память. Попробуйте напрячься и понять код. Если что-то будет непоняно - задавайте вопросы.

проверил. Похоже эта прога не переворачивает файл, а проверяет файл на целостность сзади к началу.
Плохо проверили. Там есть все, чтобы читать файл построчно задом наперед. А уж как записать то, что прочитали я думаю вы уж сами догадаетесь. Ну а не догадаетесь - так тому и быть :)
BAHbKA
Ed, не, я понял, что если прога читает файл с конца, то ничего не помешает и записать, но разобраться как поменять прогу для этого я с моими “куриными” мозгами так и не смог, поэтому пришлось идти через лес( Ну не понимаю я пока, что как работать с созданием новых классов( Как записать я знаю, но не смог как следует разобраться в самой проге. Что там и где конкретно делается. А так, как разобраться не смог, то и понять куда именно запихнуть строку вывода - не знаю(
py.user.next
BAHbKA
Смотрим на Ваше предложение. В b просто напросто не влезет весь файл. Если он большой, а это-основная идея.
py.user.next
файл нужно открывать в бинарном режиме и читать его read'ами
то есть это значит, что файл читается по блокам, блоки переворачиваются и добавляются в стек
а переворачиваются они тем способом

а не вот этим
        for k in range(0,len(s)):
##По очереди добавляем каждый элемент строки в начало
p=s[k]+p
блоки могут быть большими, в отличие от строк
зачем её добавлять в стек, если у неё длина там три символа
единственный минус в том, что файл будет читаться в список весь, но это твой метод изначальный
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB