python: SyntaxError: EOL podczas skanowania literału ciągu

164

Mam wyżej wymieniony błąd w s1="some very long string............"

Czy ktoś wie, co robię źle?

l --''''''--------- '' '' '' '' '' ''
źródło
1
Czy na pewno jest poprawnie zamykany i gdzieś nie ma cudzysłowów bez znaku zmiany znaczenia?
quantumSoup
Cudzysłowy bez znaku znaczenia powodują kolejny błąd analizy.
Styczeń

Odpowiedzi:

224

Nie wstawiasz "przed końcem linii.

Użyj, """jeśli chcesz to zrobić:

""" a very long string ...... 
....that can span multiple lines
"""
aaronasterling
źródło
17
Uważając, aby użyć tylko trzech cudzysłowów, przez przypadek miałem cztery i pojawił się błąd
Oregano,
1
A co z konkatenacją łańcuchów i zmiennych?
Daniel Springer,
92

Miałem ten problem - w końcu doszedłem do wniosku, że powodem było umieszczenie \znaków w ciągu. Jeśli masz któryś z nich, „ucieknij” przed nimi \\i powinno działać dobrze.

Chris H.
źródło
2
@Leo nazywają się „postaciami ucieczki” i jest to dość standardowe. Możesz umieścić rprzed napisem, aby uniknąć powodowania problemów.
eric
17

(Zakładając, że nie masz / nie chcesz znaków końca linii w swoim ciągu ...)

Jak długi jest ten ciąg?

Podejrzewam, że istnieje ograniczenie co do tego, jak długo może być odczytany wiersz z pliku lub z wiersza poleceń, a ponieważ koniec wiersza jest odcinany, parser widzi coś takiego s1="some very long string..........(bez zakończenia ") i w ten sposób zgłasza błąd analizy?

Możesz podzielić długie wiersze na wiele wierszy, unikając podziałów wierszy w źródle w następujący sposób:

s1="some very long string.....\
...\
...."
JanC
źródło
8

W mojej sytuacji miałem \r\nw moim słowniku ciągi znaków w pojedynczych cudzysłowach. Wymieniłem wszystkie wystąpienia \rze \\ri \nze \\ni to naprawić mój problem, właściwie powrocie uciekły podziały wiersza w eval'ed dict.

ast.literal_eval(my_str.replace('\r','\\r').replace('\n','\\n'))
  .....
Nicolas Bouliane
źródło
6

Miałem podobny problem. Miałem string, który zawierał ścieżkę do folderu w Windows np C:\Users\. Problem polega na tym, że \jest to znak ucieczki, więc aby użyć go w łańcuchach, musisz dodać jeszcze jeden \.

Błędny: C:\Users\

Poprawny: C:\\\Users\\\

Ashish kulkarni
źródło
4

Ja też miałem ten problem, chociaż były tutaj odpowiedzi, chciałbym przejść do ważnej kwestii, ponieważ /nie powinno być pustych miejsc.

madhu131313
źródło
2

Miałem też dokładnie ten komunikat o błędzie, dla mnie problem został rozwiązany poprzez dodanie znaku „\”

Okazuje się, że w moim długim łańcuchu, podzielonym na około osiem wierszy z „\” na samym końcu, brakowało „\” w jednej linii.

Python IDLE nie określił numeru wiersza, w którym wystąpił ten błąd, ale podświetlił na czerwono całkowicie poprawną instrukcję przypisania zmiennej, wyrzucając mnie. Rzeczywista, zniekształcona instrukcja łańcuchowa (zawierająca wiele wierszy ze znakiem „\”) znajdowała się obok podświetlanej instrukcji. Może to pomoże komuś innemu.

user12711
źródło
2

W moim przypadku używam systemu Windows, więc zamiast apostrofów muszę używać podwójnych cudzysłowów.

C:\Users\Dr. Printer>python -mtimeit -s"a = 0"
100000000 loops, best of 3: 0.011 usec per loop
Aminah Nuraini
źródło
2

Otrzymałem ten błąd w funkcji postgresql. Miałem długi kod SQL, który podzieliłem na wiele wierszy za pomocą \ dla lepszej czytelności. Jednak na tym polegał problem. Usunąłem wszystkie i utworzyłem je w jednej linii, aby rozwiązać problem. Używałem pgadmin III.

Ram Dwivedi
źródło
2

W moim przypadku z Mac OS X miałem następujące stwierdzenie:

model.export_srcpkg(platform, toolchain, 'mymodel_pkg.zip', 'mymodel.dylib’)

Otrzymałem błąd:

  File "<stdin>", line 1
model.export_srcpkg(platform, toolchain, 'mymodel_pkg.zip', 'mymodel.dylib’)
                                                                             ^
SyntaxError: EOL while scanning string literal

Po zmianie na:

model.export_srcpkg(platform, toolchain, "mymodel_pkg.zip", "mymodel.dylib")

Zadziałało...

David

us_david
źródło
2

Możesz spróbować tego:

s = r'long\annoying\path'
ZakS
źródło
1
To najlepsza odpowiedź. Można też spróbować s = r'long\annoying\path\\'.
shahar_m
1

Twoje variable(s1)obejmuje wiele linii. Aby to zrobić (tj. Chcesz, aby Twój ciąg obejmował wiele linii), musisz użyć potrójnych cudzysłowów ("" ").

s1="""some very long 
string............"""
Khandelwal-manik
źródło
1

W takim przypadku sprawdzą się trzy pojedyncze cudzysłowy lub trzy podwójne cudzysłowy! Na przykład:

    """Parameters:
    ...Type something.....
    .....finishing statement"""

LUB

    '''Parameters:
    ...Type something.....
    .....finishing statement'''
Areeha
źródło
0

Większość poprzednich odpowiedzi jest poprawnych, a moja odpowiedź jest bardzo podobna do aaronasterling, możesz też zrobić 3 pojedyncze cudzysłowy s1 = '' 'jakiś bardzo długi ciąg ............' ''

grepit
źródło
0

Napotkałem ten sam problem podczas uzyskiwania dostępu do dowolnego katalogu na dysku twardym. Potem rozwiązałem to w ten sposób.

 import os
 os.startfile("D:\folder_name\file_name") #running shortcut
 os.startfile("F:") #accessing directory

wprowadź opis obrazu tutaj

Powyższy obrazek przedstawia błąd i rozwiązany wynik.

Md.Rakibuz Sultan
źródło