0

所以我有一个带有一堆数字的长文本文件,我想重新格式化这个文件,以便每 12 个字符在自己的行上,文件长 4392 个字符。我的策略是将 infile 的内容添加到列表和切片中,并将前 12 个字符附加到新列表中,然后使用列表切片参数的 while 循环将其写入输出文件。我收到一个错误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

好吧,您将文件对象附加到列表中,然后您正在获取列表的切片并写入它们。也许您忘记了字符串中的文件对象引用。

只需使用 aprint outl即可获得答案。如果您在列表中的项目中有一个文件对象,那么您知道:)

或者更好:

l = []
outl=[]
with open('r6.txt', 'r') as f, \
     open('out.txt', 'w') as out:
     outl.extend(f.readlines())
     a = 0
     b = 11 
     while b <= 4392:
         l.append(outl[a:b])
         l.append('\n')
         out.writelines(l)
         a+=12
         b+=12
         l=[]
于 2013-04-25T18:21:32.247 回答
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

Vlad-ardelean 说你需要 append f.readlines()tooutl而不是 file 是正确的f

此外,您writelines()每次都使用写一行,但writelines()旨在将字符串列表写入文件,而不是一个项目列表。处理换行符插入的更好方法可能是:

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 回答