2012-07-11 42 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個字符,最後關閉文件並刪除備份。

此代碼不適合初學者(只是練習)。