2014-02-04 3 views
1

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

def file(file_name): 
    ''' gets users file and checks its validity''' 
    try: 
     open(file_name).readlines() 
    except IOError: 
     print('File not found') 
    else: 
     file = file_name.split() 
    return file 

def column_length(width): 
    '''gets column width and checks its validity''' 
    try: 
     if int(width) >= 1: 
    return int(width) 
    else: 
     print('illegal value') 
    except ValueError: 
     print('Illegal value') 


def main(): 
    file_name = input('Input file name? ') 
    width = input('column width? ') 
    lines = [] 
    line = '' 
    for i in file_name: 
     if len(i) + len(line) > int(width): 
      lines.append(line) 
      line = '' 
      line = line + i + ' ' 
     if i is file_name[-1]: lines.append(line) 
    return '\n'.join(lines) 


if __name__ == "__main__": 
    main() 

Когда я запускаю код, он, кажется, пропускает первые две функции и не возвращает никакого текста.

Если вы знаете, где я ошибаюсь, пожалуйста, дайте мне знать.

спасибо.

+0

вы даже не называть их ... – zhangxaochen

+0

Рассматривали ли вы отличный 'textwrap' модуль? – mgilson

ответ

0

это использует большой ответ от here

def chunks(l, n): 
    """ Yield successive n-sized chunks from l. 
    """ 
    for i in xrange(0, len(l), n): 
     yield l[i:i+n] 

with open('in_file.txt') as in_file, open('out_file.txt', 'w') as out_file: 
    for in_line in in_file: 
     for out_line in chunks(in_line, width) 
      out_file.write(out_line + '\n') 
0

Кроме того, очень интересно читать является реализация выравнивания текста с помощью динамического программирования. В MIT есть отличные лекционные слайды в Интернете по теме, но у this стек поток имеет большую часть. Это похоже на алгоритм латекс, используемый для того, чтобы весь текст выглядел «симпатичным». Он расширяет вашу идею обертывания текста и добавляет особенность оправдания (он добавляет пробелы, чтобы сделать его как можно лучше).

0

Ваш код пропускает первые две функции, он определяет их только. Вам нужно позвонить им откуда-то позже, как и с функцией main(). Нет видимых результатов, потому что код никогда ничего не делает с строками, возвращаемыми функцией main() (например, print).

Возможно, вы захотите использовать встроенный модуль Python textwrap для выполнения такого рода обработки текста. Вот простой пример, иллюстрирующий его использование:

import os 
import textwrap 

def get_file_name(): 
    """ Get file name and checks its validity. """ 
    file_name = input('Input file name? ') 
    if not os.path.isfile(file_name): 
     raise FileNotFoundError('"%s"' % file_name) 
    return file_name 

def get_column_width(): 
    """ Get column width and checks its validity. """ 
    width = int(input('Column width? ')) 
    if width < 1: 
     raise ValueError('column width must be greater than zero') 
    return width 

def line_wrap(file_name, width): 
    """ Read blank line delimited paragraphs of text from file and wrap them to 
     the specified width. 
    """ 
    wrapped_lines = [] 
    with open(file_name) as input_file: 
     lines = '' 
     for line in input_file: 
      lines += line 
      if not line.rstrip(): # blank line? 
       wrapped_lines.extend(textwrap.wrap(lines, width) + ['\n']) 
       lines = '' 
    if lines: # last paragraph need not be followed by blank line 
     wrapped_lines.extend(textwrap.wrap(lines, width)) 
    return wrapped_lines 

def main(): 
    file_name = get_file_name() 
    width = get_column_width() 
    wrapped_lines = line_wrap(file_name, width) 
    print('\n'.join(wrapped_lines)) 

if __name__ == "__main__": 
    main() 
Смежные вопросы