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

Python 将文本文件拆分为n个字符集,python,list,format,slice,Python,List,Format,Slice,所以我有一个长文本文件,里面有一堆数字,我想重新格式化这个文件,这样每12个字符就有一行,这个文件是4392个字符长。我的策略是将内嵌的内容添加到列表和切片中,并将前12个字符附加到新列表中,然后使用列表切片参数的while循环将其写入输出文件。我在输出时出错。writelines(l): 这是我的密码: l = [] outl=[] with open('r6.txt', 'r') as f, \ open('out.txt', 'w') as out: outl.appe

所以我有一个长文本文件,里面有一堆数字,我想重新格式化这个文件,这样每12个字符就有一行,这个文件是4392个字符长。我的策略是将内嵌的内容添加到列表和切片中,并将前12个字符附加到新列表中,然后使用列表切片参数的while循环将其写入输出文件。我在
输出时出错。writelines(l)

这是我的密码:

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=[]
l=[]
outl=[]
以open('r6.txt','r')作为f\
打开('out.txt','w')作为输出:
输出附加(f)
a=0
b=11

而b那么您将file对象附加到列表中,然后从列表中提取片段并写入它们。可能您忘记了字符串中的文件对象引用

只需使用
打印输出
即可获得答案。如果列表中的项目中有一个文件对象,则您知道:)

或者更好:

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=[]
l=[]
outl=[]
以open('r6.txt','r')作为f\
打开('out.txt','w')作为输出:
outl.extend(f.readlines())
a=0
b=11

而bVlad Ardelen说您需要将
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

嗯,虽然其他答案似乎是正确的,但我仍然认为最终的解决方案可以更快:

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

这是一个很好的方法,但是只有当输入文件是一个没有换行符的长行时,它才能正确格式化输出。OP没有说明原始文件的格式,但是如果他有一个输入文件,其中已经有几个换行符,你会如何处理呢?非常感谢Kevin,这太完美了。我喜欢你处理新台词角色的策略。你能解释一下你的for循环吗?我从未见过这样使用它。for循环是一个列表理解。你可以仔细阅读,它们并不太复杂。但是
outl[each:each+12]+'\n'
获取原始行的一个12字符片段并附加一个换行符,而
对于xrange(0,len(outl),12)中的每一行
意味着它从0开始,以字符串长度为单位,以12为增量循环。列表理解部分
l=[stuff]
意味着循环的输出被分配给列表
l
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')