1

したがって、ここでの私の目標は、出力ファイルの文字を 1 行あたり 6 文字に制限しようとすることです。ここに私がこれまでに持っているものがありますが、これは機能しません: 私が得たエラーの 1 つは、str と int を連結できないことです

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
4

4 に答える 4

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))

注: 単語の途中でテキストを分割しません。

于 2012-07-11T17:15:05.710 に答える
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)
于 2012-07-11T17:17:32.387 に答える
0

単語の境界を無視して、1 行あたり正確に 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

*ハタのレシピ

コードはバックアップ ファイルを作成し、stdout をoutputFileにリダイレクトします。次に、改行文字を削除し、行を 1 つの文字ストリームにチェーンしてファイルを 1 行ずつ (遅延して) 読み取ります。次にlimit、グルーパー レシピを使用して行ごとに文字を書き込み、最後に閉じます。ファイルを削除し、バックアップを削除します。

このコードは初心者向けではありません (単なる演習です)。

于 2012-07-11T18:48:50.620 に答える
0

read() エラー メッセージ (「文字列と int を連結できません」) は、メソッドが文字列を返すという事実に由来します。したがって、次の行で に追加1するとchar、演算子を使用して文字列と int を結合しようとしていますが+、これは不可能です。

数値的に追加したい場合は1、組み込みint()メソッドを 使用します。

char = int(char) + 1

1を文字列として 追加したい場合は、

char += '1'
于 2012-07-11T17:22:59.143 に答える