2016-08-02 30 views
0

我是蟒蛇新手,使用cx_Oracle Python包來執行一個SQL查詢:切片一個Python變量刪除整個字符串

cursor.execute("select tablespace_name from user_tablespaces") 

檢索從Oracle 11g數據庫的列表。結果是這樣的:

('SYSTEM',) 
('SYSAUX',) 
('UNDOTBS1',) 
('TEMP',) 
('USERS',) 

我需要刪除從每個條目的單引號和逗號,然後把它變成一個數組,並在嘗試使用Python切片這樣做:

tablespaceNames = [] 
for result in cursor: 
    tablespaceNames.append(result[2:-3]) 

然而,這只是讓我空字符串在我的數組:

() 
() 
() 
() 

是否與我從查詢結果中獲取的對象有問題,還是我使用python切片錯了嗎?

+2

這是因爲你只有元組中的一個項目...你應該使用'result [0]'。您不能刪除引號,因爲該值是一個字符串。 – Nicarus

+0

爲澄清術語,結果是5個元組 - 尾隨逗號是單項元組的句法設備。你的例子不會創建一個數組(你可能不需要),而是一個* list *。 – cdarke

回答

2

您切片代表每個檢索到的行元組而不是那些行的第一(只)元素中的字符串。此外,您不需要「擺脫引號」 - 這只是解釋器盡力表示數據結構。

您的數據庫返回以下結構的等價物 - 元組列表。由於您只選擇了一個字段,因此每個元組只包含一個元素。

data = [ 
    ('SYSTEM',), 
    ('SYSAUX',), 
    ('UNDOTBS1',), 
    ('TEMP',), 
    ('USERS',) 
] 

所以首先讓我們提取這些單個元素給我們自己的字符串列表,而不是元組列表。

sdata = [s[0] for s in data] 
print(sdata) 

輸出,你將看到的是

['SYSTEM', 'SYSAUX', 'UNDOTBS1', 'TEMP', 'USERS'] 

然後打印出每個元組的字符串:

for s in sdata: 
    print(s) 

從這段代碼的輸出是

SYSTEM 
SYSAUX 
UNDOTBS1 
TEMP 
USERS 

請參閱 - 無引號!

+0

謝謝,我沒有意識到我在結果集中得到了元組值,但現在這種行爲更有意義。 – Qwix

2
tableNameSpaces = [item [0][2:-3] for item in cursor] 

雖然引號會在你處理字符串文字。 然而,一旦你將它們打印出來,引號就會消失。

正如nicarus指出的,可能你根本不想截斷你的字符串文字,儘管我認爲這就是你想要的。

在這種情況下,將簡單地是:

tableNameSpaces = [item [0] for item in cursor] 
+2

我認爲切片只是試圖去除引號和逗號,所以它可能不適用於此。您的解決方案會截斷每個值。 – Nicarus

+0

這可能確實是qwix的意思,我會添加它! –

相關問題