【问题标题】:Slicing a python variable removes the whole string切片python变量会删除整个字符串
【发布时间】:2016-08-02 16:45:26
【问题描述】:

我是python新手,使用cx_Oraclepython包执行sql查询:

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 切片错误?

【问题讨论】:

  • 这是因为元组中只有一项...您应该使用result[0]。您不能删除引号,因为该值是一个字符串。
  • 为了澄清术语,结果是 5 个元组 - 尾随逗号是单项元组的句法设备。您的示例没有创建一个数组(您可能不想要),而是一个 list.

标签: python substring slice cx-oracle


【解决方案1】:

您正在对代表每个检索到的行的元组进行切片,而不是对作为这些行的第一个(也是唯一一个)元素的字符串进行切片。此外,您不需要“去掉引号”——这只是解释器尽力表示数据结构。

您的数据库返回与以下结构等效的结构 - 元组列表。由于您只选择了一个字段,因此每个元组只包含一个元素。

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

请看 - 没有引号!

【讨论】:

  • 谢谢,我没有意识到我在结果集中得到了元组值,但现在这种行为更有意义了。
【解决方案2】:
tableNameSpaces = [item [0][2:-3] for item in cursor]

不过,引号会出现,因为您正在处理字符串文字。 但是,一旦打印出来,引号就会消失。

正如 nicarus 向我指出的那样,您可能根本不想截断您的字符串文字,尽管我认为这就是您想要的。

在这种情况下,它只是:

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

【讨论】:

  • 我认为切片只是为了尝试删除引号和逗号,因此它可能不再适用于此。您的解决方案会截断每个值。
  • qwix大概就是这个意思,我补充一下!
猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 2012-02-15
  • 1970-01-01
  • 2012-03-12
  • 2013-10-29
  • 2020-11-27
  • 2021-12-08
相关资源
最近更新 更多