2014-01-14 76 views
2

很顯然,我已經知道strftimestrptime不喜歡字節字符串作爲參數,但是我在這裏是一個pickle,因爲我有點需要讀取保存在其中的具有不同字符編碼的文件內容,並且我需要處理它們,並將本文檔中每行的時間部分發送到strptime()time.strptime() - 參數0必須是str,而不是字節

一個快速的解決辦法是分割字符串,確保時間只包含數字和破折號,但是有可能以某種方式傳遞字節對象而不試圖找出編碼strptime()

with open('file.txt', 'rb') as fh: 
    for line in fh: 
     time.strptime(line, '%Y-%m-%d ...') 

這顯然會失敗。我認爲做repr(line),但導致字符串看起來像b'2014-01-07 ...',這我可以脫光..

+0

你需要'.decode()',但不知道編碼,這不是一件容易的事。 – geoffspear

+0

@Wooble:嗯,它適合日期時間模式,它幾乎肯定會適合ASCII。 「 –

+0

」在其中保存了不同的字符編碼,我需要處理它們全部「 – geoffspear

回答

0

line是一個字節串,因爲你開了二進制模式的文件。你需要解碼字符串;如果它是一個日期字符串相匹配的模式,你可以簡單地使用ASCII:

time.strptime(line.decode('ascii'), '%Y-%m-%d ...') 

您可以添加一個'ignore'論點忽略任何非ASCII,但機會是行不適合你的日期格式,然後呢。

請注意,您不能傳遞包含更多的值,而不是其中的解析格式;如果沒有明確涵蓋strptime()模式的其他文本,則無法使用您使用的任何編解碼器。

如果你的輸入真的在編解碼器中變化很大,那麼無論如何你都需要以某種方式捕捉異常。

除了UTF-16或UTF-32,我不希望你遇到任何使用不同字節的阿拉伯數字的編解碼器。如果你的輸入真的在一個文件中混合使用多字節和單字節編解碼器,那麼你的問題就更大了,而不是最重要的,因爲換行處理將會大打折扣。

+0

''ignore''可以工作,因爲它不知道導致問題的字符串的時間/日期部分是什麼,很可能是來自客戶端的日誌條目,與標準英語語言相比,具有不尋常的語言設置大部分日誌包含。因爲我最感興趣的時間/日期我可以做''ignore'',並讓字符串在最後「腐敗」,因爲日期將完好無損,thx!這很可能解決它。 – Torxed

0

,當你正在閱讀的文件,你應該對數據進行解碼:

import codecs 
with codecs.open('file.txt', encoding='utf8') as fh: 
    for line in fh: 
     time.strptime(line, '%Y-%m-%d ...') 

它總是更好的內容儘快進行解碼。

還要檢查http://docs.python.org/2/library/codecs.html#codecs.open

+0

這可能是一個好主意,但由於某些字節數據無法使用utf-8錶轉換,恐怕utf-8會在某些行上崩潰。不要問我是什麼字符,因爲我不太確定,因爲造成這個問題需要大約半天的時間通過解析文件來找到它。我沒有調試輸出,當我注意到這個問題(stopid我):) – Torxed

+0

你可以處理錯誤與錯誤=(替換|忽略)如文檔中所述 – gawel

相關問題