2013-12-11 199 views
0

我剛剛寫了幾個月的pythonPython - 在文件輸出中用換行/換行換行換行

Seconly,我有一個需要處理的txt文件。爲了正確處理它,每行必須以'\ r \ n'結尾。

但是,情況並非總是如此,有時它包含'\ n'(換行符)。

因此,我需要檢查文件,如果缺少'\ r \ n',請用'\ r \ n'替換'\ n'。

我嘗試了幾種方法並失敗。

首先,我嘗試了以下內容:

with open("initial_file.txt",'rb') as file_content: 
    #1253 is a Windows code page used to write modern Greek. 
    mycon = file_content.read().decode('cp1253') 

if (mycon.count("\r\n") == 0) and (mycon.count("\n") > 0): 
    with open("destination_file.txt",'w') as file_replace: 
    file_replace.write(mycon.replace("\n", "\r\n").encode('cp1253')) 

但不是與替換 '\ n' '\ r \ n' 我 '\ r \ r \ n'。

所以,我想另一種方法:

rf = open("initial_file.txt", 'rb') 
wf = open("destination_file.txt",'wb') 
mycon = rf.read().decode('cp1253') 
if (mycon.count('\r\n') == 0) and (mycon.count('\n') > 0): 
    for line in rf: 
     newline = line.rstrip('\n') 
     wf.write(newline).encode('cp1253') 
     wf.write('\r\n').encode('cp1253') 

它的工作的第一次,然後它沒有。

我不知道我在做什麼錯,我可以欣賞一些幫助。

回答

2

您可以使用io module中的open功能。在那裏你可以明確地指定換行模式。每'\n'轉換爲'\r\n'在這個例子:

from io import open 
with open("test.txt", "w+", newline="\r\n") as f: 
    f.write(u"Hello World\n") 

以下是文件內容(0d 0a相當於\r\n

$ hexdump -C test.txt 
00000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 0d 0a   |Hello World..| 

對於現有的文件中使用特定的線路終端模式的轉換,可以在利用universal newlines方法的同時讀取這些行,然後可以使用明確指定的行結束符爲輸出文件編寫行

from io import open 
with open(infname, 'r') as inf, open(outfname, "w+", newline="\r\n") as outf: 
    outf.writelines(inf) 

參考:

+0

謝謝,像魅力一樣工作!我會確保閱讀你所有的參考資料。 –

1

沒有編碼舞蹈,

with open("file.txt") as rf, open("out.txt", "w") as wf: 
    for line in rf: 
     wf.write("%s\r\n" % line.strip()) 

語境經理酷arn't他們。

+0

與我的fisrt代碼示例相同的問題。出於某種原因,我無法理解它將'\ n'替換爲'\ r \ r \ n' –

+0

如果您不確定該文件是否有回車符,則此答案有效。 – rjurney

0

您正在閱讀的二進制模式的輸入,但是寫在文本模式輸出。文本模式會自動將換行符轉換爲平臺特定的換行符序列。由於CP1253與ascii和unicode具有相同的換行符和回車符,因此可以完全刪除字符串替換代碼和編碼/解碼代碼。如果情況並非如此,那麼您可能希望以二進制模式打開輸出或進行其他更改。

with open("file.txt", 'rb') as rf, open("out.txt", "w") as wf: 
    wf.writelines(rf)