2017-04-21 14 views
0

這裏是一個概念性問題,我一直在關於數據的清理以及如何與列表和元組進行交互,但我不確定如何解釋,但如果我可以爲它修復,我可以在概念上更好地使用python。從列表或元組內訪問數據並清理它

在這裏:(使用python 3和sqlite3的)

我有其在MM-DD-YY 24:00的格式中它文本日期列的SQLite數據庫。當在數據庫瀏覽器中查看文本看起來很好。但是,在Python中使用fetchall()時,代碼以'MM-DD-YY \ xa0'格式打印日期。我想從代碼中清除\ xa0,並且嘗試了一些代碼,這些代碼是我認爲我應該做的事情以及我在此處閱讀的另一篇文章的組合。這是代碼:

print(dates) 
output [('MM-DD-YY\xa0',), ('MM-DD-YY\xa0',)etc.blahblah] i just typed this in here 
to show you guys the output 
dates_clean = [] 
for i in dates: 
     clean = str(i).replace(u'\xa0', u' ') 
     dates_clean.append(clean) 

現在,當我打印dates_clean我得到:

["('MM-DD-YY\xa0',)", "('MM-DD-YY\xa0',)"etc] 

所以現在你可以看到,當我試圖清理它,它做了什麼,我想它做的事,但現在它最初包含的實際元組已經成爲了文本本身的一部分,並且包含在另一個元組中。因此,當我使用UPDATE語句將此列表寫回SQLite時。所有的日期值都包含在一個元組中。

它令我感到沮喪,因爲我一直在面對諸如此類的問題,在這裏我想編輯列表或元組內的某些東西,並讓新值替換舊值而不是保留所有字符這表示它是一個元組,並使它們成爲文本。對不起,如果這是令人困惑的,就像我說過的那樣難以解釋。當我試圖清理它時,我總是會讓自己的數據變得更加骯髒。

任何有關如何有效地清潔列表和元組內數據的見解將不勝感激。我想我對訪問元組或訪問元組內部的區別感到困惑。如果你能提出我正在處理的概念性問題的名字,這也可能會有幫助,所以我可以自己做更多的研究。

謝謝!

+0

它是「MM-DD-YY 24:00」還是「MM-DD-YY 24:00」?我懷疑是後者,即不間斷使用空間是故意的,你不應該「清理」它。相反,你應該正確地打印它,即* not *使用默認的'list .__ str__',它在成員上調用'repr'。 –

+0

Python 2或3? Unicode處理是它們之間的主要變化,所以它非常重要。另外,'sqlite3'或'apsw'? –

+0

無論如何,請提供完整的代碼。 –

回答

1

錯亂輸出通過對元組調用str(),打印整個數組一次隱含的時候,或者在試圖「清理」它時明確。

見(python3):

>>> print("MM-DD-YY\xa024:00") 
MM-DD-YY 24:00 

但:

>>> print(("MM-DD-YY\xa024:00",)) 
('MM-DD-YY\xa024:00',) 

這是因爲內容tuple.__str__電話repr,在逃逸過程中的非ASCII字符。

但是,如果您將元組元素作爲單獨的參數進行打印,則結果將是正確的。所以,你要的東西,如更換打印

for row in dates: 
    print(*row) 

*擴展元組單獨的參數。因爲這些都是字符串,它們將被打印成是:

>>> row = ("MM-DD-YY\xa023:00", "MM-DD-YY\xa024:00") 
>>> print(*row) 
MM-DD-YY 23:00 MM-DD-YY 24:00 

,如果你想

>>> print(*row, sep=', ') 
MM-DD-YY 23:00, MM-DD-YY 24:00 

您可以添加分隔...或者你可以格式化:

>>> print('from {0} to {1}'.format(*row)) 
from MM-DD-YY 23:00 to MM-DD-YY 24:00 

這裏我再次使用*來擴展元組以分開參數,然後簡單地爲{0}爲第零個成員,{1}爲第一個,{2}爲第二等(如果你不需要改變順序,你也可以使用{}作爲下一步,但給指標更清晰)。


好了,現在如果你確實需要擺脫非換空間,無論如何,取而代之的是正確的工具。你只需要將它應用到元組的每個元素。有兩種方式:

  1. 顯式解構;如果適用元素的數量是固定的(應該是,它是已知的查詢的行):

    考慮:

    >>> row = ('foo', 2, 5.5) 
    

    可以解構它,並建立一個新的記錄:

    >>> (a, b, c) = row 
    >>> (a.replace('o', '0'), b + 1, c * 2) 
    ('f00', 3, 11.0) 
    

    這可以讓您對每列進行不同的轉換。

  2. 映射;適用的,當你想要做的所有元素同樣的轉變:

    考慮:

    >>> row = ('foo', 'boo', 'zoo') 
    

    你只是包裝一臺發電機理解在tuple構造:

    >>> tuple(x.replace('o', '0') for x in row) 
    ('f00', 'b00', 'z00') 
    

在附註中,SQLite有一些日期和時間函數,他們期望時間戳嚴格爲IS8601格式,即%Y-%m-%dT%H:%M:%S(可選地在末尾具有%z;使用strftime格式;在TR#35格式中,它是YYYY-MM-ddTHH-mm-ssxx))。

+0

我現在試試這個,謝謝! – Kevin

+0

嗨,這個作品很棒,可以在沒有任何\ xa0字符的情況下查看它。但是我希望在將來的文本處理任務中使用日期,並且我想確保如果使用正則表達式掃描某個日期,我不需要在搜索中添加「\ xa0」。因此,我需要確保將\ xa0轉換爲常規空間。當我嘗試將日期寫入另一個列表以重新添加到SQL中時,\ xa0仍然存在。有什麼建議麼?到目前爲止,你一直都非常樂意嘮叨你。 – Kevin

+0

@Kevin,已更新 –

0

在你的情況下,dates實際上是一個元組列表,每個元組包含一個字符串元素。日期字符串末尾的,是您如何識別單個元素元組。

您需要的for循環需要處理元組內的每個元素,而不是元組本身。沿着線的東西:

for i in dates: 
    date = i[0] 
    clean = str(date).replace('\xa0', '') 
    dates_clean.append(date) 

我不知道這個最佳的解決方案,以在數據庫操作數據的實際問題,但應該回答你的問題。

編輯:另外,請參閱該月的答覆關於unicode字符串和python 2比蟒蛇3

+0

好吧,考慮到strout()會在第一個地方輸出輸出,我認爲你不應該叫它... –

+0

嗯我會試試這個,謝謝! – Kevin

+0

哎喲感謝您的幫助,但我認爲這可能需要一些更改,因爲設置日期= i [0]導致它只是使列表中的第一個日期重複一遍又一遍,它仍然是我解釋的格式本來。 – Kevin