Замена символов в строке Python - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь очистить список, который по сути является определением таблицы, которое я извлек из базы данных Teradata, используя SQLAlchemy. По сути, я пытаюсь заменить символ \ r из строки

Я пытался использовать функцию замены в цикле for, как показано ниже

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'

Ответы [ 2 ]

1 голос
/ 14 мая 2019

В вашем коде есть простое исправление, которое должно заставить его работать. Я уверен, что вы просто неправильно использовали функцию .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)
0 голосов
/ 16 мая 2019

Элемент, содержащийся в вашем списке, является кортежем.

Если вы напечатаете результаты [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" будет на самом деле напечатано, а не значение escape-последовательности "\г ", который является возврат каретки.Для этого добавляется еще один обратный слеш, давая escape-последовательность «\\», которая буквально представляет один «\»

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

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

Итак, чтобы удалить этот символ «\\ r», вынужно правильно его идентифицировать.

...