Frage Pythonischer Weg, um eine lange mehrzeilige Zeichenfolge zu erstellen


Ich habe eine sehr lange Frage. Ich möchte es in mehreren Zeilen in Python aufteilen. Eine Möglichkeit, dies in JavaScript zu tun, wäre die Verwendung mehrerer Sätze und deren Verknüpfung mit einem + Operator (Ich weiß, vielleicht ist es nicht der effizienteste Weg, es zu tun, aber ich bin nicht wirklich besorgt über die Leistung in diesem Stadium, nur Code Lesbarkeit). Beispiel:

var long_string = 'some text not important. just garbage to' +
                  'illustrate my example';

Ich habe versucht, etwas Ähnliches in Python zu machen, aber es hat nicht funktioniert, also habe ich es benutzt \ um die lange Saite zu teilen. Ich bin mir jedoch nicht sicher, ob dies der einzige / beste / pythonsche Weg ist, dies zu tun. Es sieht umständlich aus. Tatsächlicher Code:

query = 'SELECT action.descr as "action", '\
    'role.id as role_id,'\
    'role.descr as role'\
    'FROM '\
    'public.role_action_def,'\
    'public.role,'\
    'public.record_def, '\
    'public.action'\
    'WHERE role.id = role_action_def.role_id AND'\
    'record_def.id = role_action_def.def_id AND'\
    'action.id = role_action_def.action_id AND'\
    'role_action_def.account_id = ' + account_id + ' AND'\
    'record_def.account_id=' + account_id + ' AND'\
    'def_id=' + def_id

778
2018-05-18 22:21


Ursprung


Antworten:


Sprechen Sie über mehrzeilige Saiten? Einfach, verwenden Sie dreifache Anführungszeichen, um sie zu beginnen und zu beenden.

s = """ this is a very
        long string if I had the
        energy to type more and more ..."""

Sie können auch einfache Anführungszeichen verwenden (3 davon natürlich am Anfang und Ende) und die resultierende Zeichenfolge behandeln s genau wie jede andere Saite.

HINWEIS: Wie bei jedem String wird auch alles zwischen den Anführungszeichen am Anfang und am Ende Teil der Zeichenkette. Daher hat dieses Beispiel eine führende Leerstelle (wie von @ root45 hervorgehoben). Diese Zeichenfolge enthält auch Leerzeichen und Zeilenumbrüche.

Ie.,:

' this is a very\n        long string if I had the\n        energy to type more and more ...'

Schließlich kann man in Python auch lange Linien wie folgt konstruieren:

 s = ("this is a very"
      "long string too"
      "for sure ..."
     )

welches wird nicht Fügen Sie zusätzliche Leerzeichen oder Zeilenumbrüche ein (dies ist ein Beispiel, das zeigt, wie sich der Effekt des Überspringens von Leerzeichen auswirkt):

'this is a verylong string toofor sure ...'

Es sind keine Kommas erforderlich. Platzieren Sie einfach die zu verknüpfenden Zeichenfolgen in einem Klammerpaar und achten Sie darauf, dass alle erforderlichen Leerzeichen und Zeilenumbrüche berücksichtigt werden.


1335
2018-05-18 22:22



Wenn Sie keine mehrzeilige Zeichenfolge möchten, sondern nur eine lange Zeile mit einer einzigen Zeile haben, können Sie Klammern verwenden. Achten Sie darauf, dass Sie keine Kommas zwischen den Zeichenfolgensegmenten einfügen, dann wird es ein Tupel sein.

query = ('SELECT   action.descr as "action", '
         'role.id as role_id,'
         'role.descr as role'
         ' FROM '
         'public.role_action_def,'
         'public.role,'
         'public.record_def, '
         'public.action'
         ' WHERE role.id = role_action_def.role_id AND'
         ' record_def.id = role_action_def.def_id AND'
         ' action.id = role_action_def.action_id AND'
         ' role_action_def.account_id = '+account_id+' AND'
         ' record_def.account_id='+account_id+' AND'
         ' def_id='+def_id)

In einer SQL-Anweisung wie dem, was Sie konstruieren, wären mehrzeilige Strings auch in Ordnung. Aber wenn das zusätzliche Leerzeichen, das eine mehrzeilige Zeichenfolge enthalten würde, ein Problem wäre, dann wäre dies ein guter Weg, um zu erreichen, was Sie wollen.


125
2018-05-18 22:26



Linien durchbrechen \ funktioniert bei mir. Hier ist ein Beispiel:

longStr = "This is a very long string " \
        "that I wrote to help somebody " \
        "who had a question about " \
        "writing long strings in Python"

100
2018-06-20 16:16



Ich fand mich glücklich mit diesem:

string = """This is a
very long string,
containing commas,
that I split up
for readability""".replace('\n',' ')

34
2018-01-04 10:39



Ich finde, dass Sie beim Erstellen langer Strings in der Regel so etwas wie das Erstellen einer SQL-Abfrage tun. In diesem Fall ist das das Beste:

query = ' '.join((  # note double parens, join() takes an iterable
    "SELECT foo",
    "FROM bar",
    "WHERE baz",
))

Was Levon vorgeschlagen hat, ist gut, könnte aber anfällig für Fehler sein:

query = (
    "SELECT foo"
    "FROM bar"
    "WHERE baz"
)

query == "SELECT fooFROM barWHERE baz"  # probably not what you want

27
2018-06-19 07:06



Sie können Variablen auch verketten, wenn Sie die Notation "" verwenden:

foo = '1234'

long_string = """fosdl a sdlfklaskdf as
as df ajsdfj asdfa sld
a sdf alsdfl alsdfl """ +  foo + """ aks
asdkfkasdk fak"""

EDIT: Finden Sie einen besseren Weg, mit den Namen params und .format ():

body = """
<html>
<head>
</head>
<body>
    <p>Lorem ipsum.</p>
    <dl>
        <dt>Asdf:</dt>     <dd><a href="{link}">{name}</a></dd>
    </dl>
    </body>
</html>
""".format(
    link='http://www.asdf.com',
    name='Asdf',
)

print(body)

20
2017-10-06 22:33



In Python> = 3.6 können Sie verwenden Formatierte Zeichenfolgenliterale (f-Zeichenfolge)

query= f'''SELECT   action.descr as "action"
    role.id as role_id,
    role.descr as role
    FROM
    public.role_action_def,
    public.role,
    public.record_def,
    public.action
    WHERE role.id = role_action_def.role_id AND
    record_def.id = role_action_def.def_id AND
    action.id = role_action_def.action_id AND
    role_action_def.account_id = {account_id} AND
    record_def.account_id = {account_id} AND
    def_id = {def_id}'''

14
2018-04-25 18:47



Beispielsweise:

sql = ("select field1, field2, field3, field4 "
       "from table "
       "where condition1={} "
       "and condition2={}").format(1, 2)

Output: 'select field1, field2, field3, field4 from table 
         where condition1=1 and condition2=2'

Wenn der Wert der Bedingung eine Zeichenfolge sein soll, können Sie Folgendes tun:

sql = ("select field1, field2, field3, field4 "
       "from table "
       "where condition1='{0}' "
       "and condition2='{1}'").format('2016-10-12', '2017-10-12')

Output: "select field1, field2, field3, field4 from table where
         condition1='2016-10-12' and condition2='2017-10-12'"

8
2018-05-12 12:05



Ich persönlich finde das folgende, um die beste (einfache, sichere und pythonische) Möglichkeit zu sein, Raw-SQL-Abfragen in Python zu schreiben, besonders bei der Verwendung Pythons sqlite3-Modul:

query = '''
    SELECT
        action.descr as action,
        role.id as role_id,
        role.descr as role
    FROM
        public.role_action_def,
        public.role,
        public.record_def,
        public.action
    WHERE
        role.id = role_action_def.role_id
        AND record_def.id = role_action_def.def_id
        AND action.id = role_action_def.action_id
        AND role_action_def.account_id = ?
        AND record_def.account_id = ?
        AND def_id = ?
'''
vars = (account_id, account_id, def_id)   # a tuple of query variables
cursor.execute(query, vars)   # using Python's sqlite3 module

Pros

  • Ordentlicher und einfacher Code (Pythonic!)
  • Sicher vor SQL-Injection
  • Kompatibel mit Python 2 und Python 3 (es ist schließlich Pythonic)
  • Keine String-Verkettung erforderlich
  • Es muss nicht sichergestellt werden, dass das am weitesten rechts stehende Zeichen jeder Zeile ein Leerzeichen ist

Nachteile

  • Da Variablen in der Abfrage durch die ersetzt werden ? Platzhalter, es kann ein wenig schwierig werden, den Überblick zu behalten ? ist durch welche Python-Variable zu ersetzen, wenn es viele von ihnen in der Abfrage gibt.

5
2017-11-14 19:16



Ihr tatsächlicher Code sollte nicht funktionieren, Ihnen fehlen Whitespaces am Ende von "Zeilen" (zB: role.descr as roleFROM...)

Es gibt triplequotes für mehrzeilige Zeichenfolge:

string = """line
  line2
  line3"""

Es enthält die Zeilenumbrüche und zusätzliche Leerzeichen, aber für SQL ist das kein Problem.


3
2018-05-18 22:25



Normalerweise benutze ich so etwas:

text = '''
    This string was typed to be a demo
    on how could we write a multi-line
    text in Python.
'''

Wenn Sie lästige Leerzeichen in jeder Zeile entfernen möchten, können Sie folgendermaßen vorgehen:

text = '\n'.join([line.lstrip() for line in text.split('\n')])

3
2018-06-21 17:36