Неожиданная ошибка при использовании функции поиска в файле (Python 3.6.3) [duplicate]

Поскольку люди, похоже, обращаются к этому вопросу, когда речь заходит об ошибках компоновщика, я собираюсь добавить это здесь.

Одной из возможных причин ошибок компоновщика с GCC 5.2.0 является то, что новая библиотека libstdc ++ ABI теперь выбран по умолчанию.

Если вы получаете ошибки компоновщика о неопределенных ссылках на символы, которые включают типы в пространстве имен std :: __ cxx11 или теге [abi: cxx11], то это, вероятно, указывает на то, что вы пытаетесь связать файлы объектов, которые были скомпилированы с различными значениями для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать свой код со старым ABI.

. Если вы вдруг получите ошибки компоновщика при переключении на GCC после 5.1.0 это было бы замечательно.

12
задан seriousgeek 3 February 2014 в 19:14
поделиться

2 ответа

Существующие ответы do отвечают на вопрос, но не дают решения .

Из readthedocs :

Если файл открыт в текстовом режиме (без b), только смещения, возвращенные tell(), являются законными. Использование других смещений вызывает неопределенное поведение.

Это поддерживается документацией , в которой говорится, что:

В текстовых файлах (те, которые открыты без b в строке режима), разрешены только запросы относительно начала файла [os.SEEK_SET] ...

Это означает, что если у вас есть этот код из старого Python:

f.seek(-1, 1)   # seek -1 from current position

, он будет выглядеть так в Python 3:

f.seek(f.tell() - 1, os.SEEK_SET)   # os.SEEK_SET == 0

Решение

эту информацию вместе мы можем достичь цели ОП:

f.seek(0, os.SEEK_END)              # seek to end of file; f.seek(0, 2) is legal
f.seek(f.tell() - 3, os.SEEK_SET)   # go backwards 3 bytes
23
ответ дан Eric Lindsey 24 August 2018 в 16:48
поделиться

Чтобы использовать поиск с текущей позиции и конца, вам нужно открыть текстовый файл в двоичном режиме. См. Этот пример, где я создал файл «nums.txt» и поместил в файл «ABCDEFGHIJKLMNOPQRSTUVWXYZ». Я прочитал буквы строки «PYTHON» из файла и отобразил их. См. Код, который я запускал в окнах python 3.6 в anaconda 4.2

    >>> file=open('nums.txt','rb')
    >>> file.seek(15,0)
    15
    >>> file.read(1).decode('utf-8')
    'P'
    >>> file.seek(8,1)
    24
    >>> file.read(1).decode('utf-8')
    'Y'
    >>> file.seek(-7,2)
    19
    >>> file.read(1).decode('utf-8')
    'T'
    >>> file.seek(7,0)
    7
    >>> file.read(1).decode('utf-8')
    'H'
    >>> file.seek(6,1)
    14
    >>> file.read(1).decode('utf-8')
    'O'
    >>> file.seek(-2,1)
    13
    >>> file.read(1).decode('utf-8')
    'N'
2
ответ дан Kevin 24 August 2018 в 16:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: