所以我的目标是尝试将输出文件中的字符限制为每行6个字符。 这是我到目前为止,但这不起作用:我得到的一个错误是无法连接str和int
def charLimit(outputfile):
limit =6
char = 0
with open(outputFile,'r+') as file:
for char in char.len():
if char != 6 :
char = file.read(char)
char += 1
else:
file.write('\n')
char = 0
答案 0 :(得分:2)
您可以使用textwrap
模块:
import textwrap
with open(outputFile) as file:
text = file.read()
with open(outputFile, 'w') as file:
file.write(textwrap.fill(text, width=6))
注意:它不会在单词中间拆分文本。
答案 1 :(得分:0)
您不能同时读/写同一个文件,因为您每6个字符插入一行换行符。这些换行符将覆盖文件中的下一个字符。假设文件的内容如下:
123456789
如果您只是在每第6行后写一个换行符,那么您的文件将如下:
123456
89
注意换行如何覆盖"7"
。
如果您的文件相对较小(可能是几兆字节),您可以避免创建临时文件,只需将整个文件读入内存,将缓冲区位置设置回0,然后覆盖它,如下所示:
with open(filename, 'r+') as f:
raw = f.read()
f.seek(0) #sets the buffer position back to the beginning of the file
for i in xrange(0, len(raw), limit):
line = raw[i:i+limit].rstrip('\n').replace('\n', ' ')
f.write(line + '\n')
但是,如果您的文件非常大,则不将整个数据加载到内存中,而是写入临时文件,然后复制:
with open(filename, 'r') as infile, open('tmp.txt', 'w') as outfile:
line =
while True:
line = infile.read(limit)
#if there is no more text to read from file, exit the loop
if not line:
break
outfile.write(line.rstrip('\n').replace('\n', ' ') + '\n')
import shutil
shutil.copyfile('tmp.txt', filename)
答案 2 :(得分:0)
您的错误消息(“无法连接字符串和int”)来自read()
方法返回字符串的事实。因此,当您在下一行中将1
添加到char
时,您正尝试使用+
运算符将字符串与int组合,这是不可能的。
如果您想以数字方式添加1
,请使用内置的int()
方法,例如
char = int(char) + 1
如果您想将1
添加为字符串,请使用
char += '1'
答案 3 :(得分:0)
要获得每行正好6个字符(不包括换行符本身),忽略单词边界:
import fileinput
from itertools import chain, izip_longest
limit = 6
lines = (line.rstrip('\n') for line in fileinput.input([outputFile], inplace=1))
chars = chain.from_iterable(lines) # all characters
for chunk in izip_longest(*[chars]*limit, fillvalue=''): # grouper recipe*
print(''.join(chunk)) # write to outputFile
fileinput.close() # close outputFile, delete backup
代码创建一个备份文件并将stdout重定向到outputFile
,然后它(懒惰地)读取文件,逐行删除换行符并将行链接成单个字符串,然后写入{{1使用分组器配方每行的字符,最后它关闭文件并删除备份。
此代码不适合初学者(只是练习)。