【问题标题】:Replacing characters in Python string替换 Python 字符串中的字符
【发布时间】:2019-10-01 21:46:32
【问题描述】:

我正在尝试清理一个列表,该列表本质上是我使用 SQLAlchemy 从 Teradata DB 中提取的表定义。我实际上是在尝试替换字符串中的 \r 字符

我尝试在 for 循环中使用 replace 函数,如下所示

import teradata
import sqlalchemy
import string


eng = sqlalchemy.create_engine('teradatasql:///?user=xxxx&       

# execute sql
query = 'SHOW TABLE DBADMIN_BKP.LIKP_BKP'
result = eng.execute(query)
results = result.fetchall()
results = [items.replace("\n", "") for items in results]

print (results)


Traceback (most recent call last):
File "SQL_ALCHEMY.py", line 12, in <module>
results = [items.str_replace("\n", "") for items in results]
File "SQL_ALCHEMY.py", line 12, in <listcomp>
results = [items.str_replace("\n", "") for items in results]
AttributeError: Could not locate column in row for column 'replace'

【问题讨论】:

  • 你确定items 是一个字符串吗?我建议检查results 的元素实际上是什么。
  • 你能发一些items 来确定你在做什么吗?
  • 这是分配给变量的数据示例:[("CREATE MULTISET TABLE DBADMIN_BKP.LIKP_BKP ,NO FALLBACK ,\r NO BEFORE JOURNAL,\r NO AFTER JOURNAL,\r CHECKSUM = DEFAULT,\r DEFAULT ME ... (12819 个字符被截断) ... HARACTER SET UNICODE CASESPECIFIC NOT NULL,\r FSH_VAS_CG CHAR(3) CHARACTER SET UNICODE CASESPECIFIC NOT NULL, \rPRIMARY KEY ( MANDT ,VBELN ))\r; ",)]
  • 以上数据为打印结果(results)
  • 我现在已经设法将列表转换为字符串,现在我正在尝试像这样使用替换函数: results = results.replace('\r', '') 代码没有通过错误但可怕的 \r 仍然存在:(

标签: python string sqlalchemy teradata str-replace


【解决方案1】:

对您的代码有一个简单的修复,它应该可以正常工作。我很确定您只是在代码中误用了.replace() 函数。这是正确的代码:

import teradata
import sqlalchemy
import string


eng = sqlalchemy.create_engine('teradatasql:///?user=xxxx&')

# execute sql
query = 'SHOW TABLE DBADMIN_BKP.LIKP_BKP'
result = eng.execute(query)
results = result.fetchall()
results = results.replace("\n", "") #This is the segment of the code that was causing the error. 

print (results)

【讨论】:

  • 这是我在尝试了您的建议 Traceback(最近一次调用最后一次)后得到的错误:文件“SQL_ALCHEMY.py”,第 13 行,在 results = results.replace("\n ", "") AttributeError: 'list' 对象没有属性 'replace'
  • 我现在已经设法将列表转换为字符串,现在我正在尝试像这样使用替换函数: results = results.replace('\r', '') 代码没有通过错误但可怕的 \r 仍然存在:(
  • 令人沮丧的是它适用于字符串中的其他字符,但不适用于 \r
【解决方案2】:

列表中包含的项目是一个元组。

如果您打印结果[0],您将获得:

('CREATE MULTISET TABLE DBADMIN_BKP.LIKP_BKP ,NO FALLBACK ,\r NO BEFORE JOURNAL,\r NO AFTER JOURNAL,\r CHECKSUM = DEFAULT,\r DEFAULT ME ... (12819 characters truncated) ... HARACTER SET UNICODE CASESPECIFIC NOT NULL,\r FSH_VAS_CG CHAR(3) CHARACTER SET UNICODE CASESPECIFIC NOT NULL, \rPRIMARY KEY ( MANDT ,VBELN ))\r;',)

现在你已经说过你已经把它变成了一个字符串,我假设你是通过 str(results[i]) 做到的。这会产生:

"('CREATE MULTISET TABLE DBADMIN_BKP.LIKP_BKP ,NO FALLBACK ,\\r NO BEFORE JOURNAL,\\r NO AFTER JOURNAL,\\r CHECKSUM = DEFAULT,\\r DEFAULT ME ... (12819 characters truncated) ... HARACTER SET UNICODE CASESPECIFIC NOT NULL,\\r FSH_VAS_CG CHAR(3) CHARACTER SET UNICODE CASESPECIFIC NOT NULL, \\rPRIMARY KEY ( MANDT ,VBELN ))\\r;',)"

当它被转换成一个字符串时,Python 想要确保 实际上 打印“\r”,而不是转义序列“\r”的含义,它是一个回车符.为了做到这一点,添加了另一个反斜杠,给出了转义序列“\\”,它的字面意思是一个“\”

>>> print("\\r")
\r
>>> print("\r")

>>> print("\\")
\
>>> print("\")
  File "<stdin>", line 1
    print("\")
             ^
SyntaxError: EOL while scanning string literal

所以为了去掉这个“\\r”字符,你需要正确识别它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2022-01-22
    • 2017-04-13
    • 2019-01-30
    • 2015-01-01
    相关资源
    最近更新 更多