2012-07-11 56 views
0

所以我的目标是试图将输出文件中的字符限制为每行6个字符。 这里是我到目前为止,但这不工作:一,我得到的是不能连接海峡和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 
+1

'char for char.len()'你在这里做什么?'char'不应该有'len()'方法,即使它做了也不会返回一个迭代。 – GWW 2012-07-11 17:12:39

回答

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

注意:它不会在文字中间分割文字。

+0

塞巴斯蒂安非常感谢这项工作 – 2012-07-11 17:38:04

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) 
+0

如何将tmp.tmp复制到相同的输出文件或我需要复制到单独的文件? – 2012-07-11 17:25:57

+0

@ChadD:查看我的编辑。 – 2012-07-11 20:33:49

0

你的错误信息(“不能连接字符串和int“)来自的事实方法返回一个字符串。因此,当您在下一行中添加1char时,您尝试使用+运算符将字符串与int组合,这是不可能的。

如果您想以数字方式添加1,请使用内置的int()方法(例如,

char = int(char) + 1 

如果你想在1添加一个字符串,使用

char += '1' 
+0

感谢这使得很多感觉:) – 2012-07-11 17:37:43

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 

*grouper recipe

该代码创建一个备份fi并将stdout重定向到outputFile,然后它会逐行读取(延迟)逐行扫描换行符的文件并将行链接成单个字符流,然后使用石斑鱼配方每行写入limit个字符,最后关闭文件并删除备份。

此代码不适合初学者(只是练习)。