0

したがって、多数の数字を含む長いテキスト ファイルがあり、このファイルを再フォーマットして、12 文字ごとに 1 行に 4392 文字の長さになるようにしたいと考えています。私の戦略は、infile の内容をリストとスライスに追加し、最初の 12 文字を新しいリストに追加してから、リスト スライス パラメータの while ループを使用して outfile に書き込むことでした。次のエラーが表示されout.writelines(l)ます:

TypeError: writelines() argument must be a sequence of strings.

これが私のコードです:

l = []
outl=[]
with open('r6.txt', 'r') as f, \
     open('out.txt', 'w') as out:
     outl.append(f)
     a = 0
     b = 11 
     while b <= 4392:
         l.append(outl[a:b])
         l.append('/n')
         out.writelines(l)
         a+=12
         b+=12
         l=[]
4

3 に答える 3

1

うーん、他の答えは正しいようですが、最終的な解決策はもっと速いと思います:

with open('r6.txt', 'r') as f, \
    open('out.txt', 'w') as out:
    # call anonymous lambda function returning f.read(12) until output is '', put output to part
    for part in iter(lambda: f.read(12), ''):
        # write this part and newline character
        out.write(part)
        out.write('\n')
于 2013-04-25T19:17:11.487 に答える
0

ファイルの代わりに追加f.readlines()する必要があると言っている Vlad-ardelean は正しいです。outlf

また、writelines()毎回1行を書き込むために使用しwritelines()ていますが、1つのアイテムリストではなく、文字列のリストをファイルに書き出すことを目的としています。おそらく、改行文字の挿入にアプローチするより良い方法は次のとおりです。

l = []
outl=[]
with open('r6.txt', 'r') as f, \
    open('out.txt', 'w') as out:
    # gets entire file as one string and removes line breaks
    outl = ''.join(f.readlines()).replace('\n','')
    l = [outl[each:each+12]+'\n' for each in xrange(0,len(outl),12)]
    out.writelines(l)

r6 の入力例:

abcdefeounv lernbtlttb
berolinervio
bnrtopimrtynprymnpobm,t
2497839085gh
b640h846j048nm5gh0m8-9
2g395gm4-59m46bn
2vb-9mb5-9046m-b946m-b946mb-96m-05n=570n;rlgbm'dfb

出力:

abcdefeounv 
lernbtlttbbe
rolinerviobn
rtopimrtynpr
ymnpobm,t249
7839085ghb64
0h846j048nm5
gh0m8-92g395
gm4-59m46bn2
vb-9mb5-9046
m-b946m-b946
mb-96m-05n=5
70n;rlgbm'df
b
于 2013-04-25T19:03:08.573 に答える