将文本文件拆分为n个字符的集合

时间:2013-04-25 18:18:14

标签: python list format slice

所以我有一个带有大量数字的长文本文件,我想重新格式化这个文件,这样每12个字符就在他们自己的行上,文件长度为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=[]

3 个答案:

答案 0 :(得分:1)

嗯,你将文件对象附加到列表中,然后你正在对列表进行切片并编写它们。也许您忘记了字符串中的文件对象引用。

只需使用print 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=[]

答案 1 :(得分: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')

答案 2 :(得分:0)

Vlad-ardelean说你需要将f.readlines()追加到outl而不是文件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