2012-07-11 3 views
0

Итак, моя цель заключается в том, чтобы ограничить символы в выходном файле шестью символами в строке. Вот что я до сих пор, но это не работает: Одна из ошибок, которые я получил, не сцеплять и ул ИНТлимит символов в строке в выходном файле

def charLimit(outputfile): 

     limit =6 
     char = 0 
     with open(outputFile,'r+') as file: 
      for char in char.len(): 
       if char != 6 : 
        char = file.read(char) 
        char += 1 
       else: 
        file.write('\n') 
        char = 0 
+1

'for char in char.len()' Что вы пытаетесь сделать здесь?'char' не должен иметь метод' len() ', и даже если бы он это сделал, он бы не возвращал итерабельность. – GWW

ответ

2

Вы можете использовать textwrap модуль:

import textwrap 

with open(outputFile) as file: 
    text = file.read() 

with open(outputFile, 'w') as file: 
    file.write(textwrap.fill(text, width=6)) 

Примечание: он не разделяет текст в середине слова.

+0

Sebastian благодарит эту работу очень хорошо –

0

Вы не можете просто читать/записывать в один и тот же файл одновременно, потому что вы вставляете символы новой строки каждые 6 символов. Эти новые строки будут перезаписывать следующий символ в файле. Скажем, содержимое файла являются следующие:

123456789 

Если вы просто написать строку в файл после каждого 6-й строке, файл будет иметь следующий вид:

123456 
89 

Обратите внимание, как символ новой строки затирает "7".

Если файл является относительно небольшим (пару мегабайт, может быть), вы можете не создавать временный файл и просто читать весь файл в память, установить позицию буфера обратно в 0, и переписать его, например, так:

with open(filename, 'r+') as f: 
    raw = f.read() 
    f.seek(0) #sets the buffer position back to the beginning of the file 
    for i in xrange(0, len(raw), limit): 
     line = raw[i:i+limit].rstrip('\n').replace('\n', ' ') 
     f.write(line + '\n') 

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

with open(filename, 'r') as infile, open('tmp.txt', 'w') as outfile: 
    line = 
    while True: 
     line = infile.read(limit) 

     #if there is no more text to read from file, exit the loop 
     if not line: 
      break 

     outfile.write(line.rstrip('\n').replace('\n', ' ') + '\n') 

import shutil 

shutil.copyfile('tmp.txt', filename) 
+0

как я могу скопировать tmp.tmp в тот же выходной файл или мне нужно скопировать в отдельный файл? –

+0

@ChadD: Смотрите мои правки. –

0

ваше сообщение об ошибке ("не может concatenate string и int ") происходит из-за того, что read() метод возвращает строку. Поэтому, когда в следующей строке вы добавляете 1 в char, вы пытаетесь объединить строку с int, используя оператор +, что невозможно.

Если вы хотите добавить числовое значение 1, используйте встроенный метод int(), например.

char = int(char) + 1 

Если вы хотели бы добавить 1 в виде строки, используйте

char += '1' 
+0

спасибо, это много смысла :) –

0

Чтобы получить ровно 6 символов в строке (не включая сам символ новой строки) без учета границ слов:

import fileinput 
from itertools import chain, izip_longest 

limit = 6 
lines = (line.rstrip('\n') for line in fileinput.input([outputFile], inplace=1)) 
chars = chain.from_iterable(lines) # all characters 
for chunk in izip_longest(*[chars]*limit, fillvalue=''): # grouper recipe* 
    print(''.join(chunk)) # write to outputFile 
fileinput.close() # close outputFile, delete backup 

*grouper recipe

Код создает резервную копию le и перенаправляет stdout на outputFile, тогда он читает (лениво) файл строки за строкой, лишая символ новой строки и цепляя строки в один поток символов, затем записывает limit символов в строке с использованием рецепта grouper, наконец, он закрывает файл и удаляет резервную копию.

Этот код не для новичков (просто упражнение).

Смежные вопросы