所以我有一个带有大量数字的长文本文件,我想重新格式化这个文件,这样每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=[]
答案 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