2012-12-13 61 views
2

我在運行在Ubuntu盒子上的Python腳本中使用import fileinputPython識別 r作爲行分隔符

我正在命令行上運行腳本,沿着python myscript.py firstinputfile.txt secondinputfile.txtmyscript.py的內容行,我使用for line in fileinput.input()來遍歷行。我遇到的問題是,firstinputfile.txtsecondinputfile.txt都使用Macintosh(\r)行結尾,並且fileinput.input()似乎沒有將\r識別爲行分隔符。

有什麼辦法可以強制fileinput\r識別爲行分隔符嗎?

我認爲預處理firstinputfile.txtsecondinputfile.txt使用\n線的結局,但我猶豫的原因有兩個:1)我真的不希望發出額外的文件來管理和ii)我仍然希望輸入fileinput來自文件參數(不是管道命令後的stdin),所以我可以使用fileinput.filename()fileinput.filelineno()

有什麼建議嗎?

+0

你可以在文件中用'\ r \ n'代替'\ r' ..在閱讀 – avasal

+0

@avasal之前我可以,但我寧願不要有副作用。理想情況下,我希望能夠在接收它們的狀態下將文件作爲輸入,並輸出我需要的內容,而不會創建任何中間狀態/突變輸入源。 –

+0

然後可能如果該文件不是太大,你可以讀取所有的內容作爲一個字符串和拆分使用'\ r'創建一個列表,然後遍歷它 – avasal

回答

3

原來fileinput.input()支持可選openhook參數:

您可以控制文件是如何被通過 提供開口鉤openhook參數fileinput.input()或的FileInput()打開。掛鉤 必須是一個帶有兩個參數,文件名和模式的函數,並且返回一個相應打開的文件類對象。這個模塊已經提供了兩個有用的掛鉤 。

此外,universal newline support文件表明,一個文件可以是開放的支持與rU模式Windows/Unix的/ Macintosh的換行符:

打開文件與模式「U」或'儒的將以通用換行模式打開一個用於讀取 的文件。所有三行結尾約定將被 轉換爲由諸如read()和readline()等各種文件 方法返回的字符串中的「\ n」。

所以,你可以寫一個小功能,通過爲openhook論點將以某種方式打開該文件,它支持通用換行符:

def univ_file_read(name, mode): 
    # WARNING: ignores mode argument passed to this function 
    return open(name, 'rU') 

然後,而不是:

for line in fileinput.input(): 

用途:

for line in fileinput.input(openhook=univ_file_read): 

這似乎對我有用,現在\r被識別爲行分隔符。