2016-06-21 44 views
0

我想在Linux(Ubuntu 16.04 x64)和Windows(x64)上測試使用csv.writer在python 2 & 3上生成的csv文件。不幸的是,每次寫入文件時,Windows都會增加一個額外的\r__repr__在Windows上不顯示回車在終端

我想我會試圖打印repr這些文件中的行,但repr的輸出不顯示在Windows上\r的存在。

例如,從csv文件的線顯示,因爲這在終端在Windows:

'display,resource,refs\n' 

從同一文件的同一個句子被示出,因爲這在Ubuntu:

'display,resource,refs\r\n' 

如何才能調試這些額外的\r,並將其添加到我的文件中?

+0

你是如何印製這些線條的?你究竟在做什麼? Windows和Unix使用不同的行結束約定,因此兩個系統上的文本文件略有不同。但是你可以用不同的程序在它們之間進行轉換,許多程序可以識別這兩種格式,而不需要你做任何事情。 – BrenBarn

+0

你是如何打開文件的?你可能想'wb'而不是'w'。 – MatsLindh

+0

@BrenBarn在這些文件上運行帶有預存散列的測試套件會在Windows上出錯。我試圖通過那些刪除額外的回車。 – goelakash

回答

0

我找到了一個名爲dos2unix的工具,可以通過pip安裝。

要將所有\r\n實例轉換到我的CSV文件的\n情況下,我可以使用此代碼:

import os 
os.system("dos2unix -n "+filename+" "+filename) 
0

的問題是,Windows和Linux的不同定義線標誌的結束。對於linux,它只是換行'\n',但對於Windows,它是換行,然後是回車'\r\n'

當您在Windows上的Python中以文本模式打開文件時,任何換行符都會自動轉換爲'\r\n'。這是可取的,因爲Windows上的許多其他程序本身不會將換行符視爲新行標記(例如記事本)。

爲了解決這個問題,你可以明確地告訴python你想要新的行標記的樣子。例如。

with open("text.txt", "w", newline="\n") as f: 
    f.write("hello\n") 
    f.write("world\n") 

# open in binary mode so we can see exactly what is in the file 
with open("text.txt", "rb") as f: 
    data = f.read() 

print(repr(data)) 
assert data == b"hello\nworld\n" 

如果您正在使用Python 2,那麼你就需要使用open功能io模塊來代替。