Поскольку люди, похоже, обращаются к этому вопросу, когда речь заходит об ошибках компоновщика, я собираюсь добавить это здесь.
Одной из возможных причин ошибок компоновщика с GCC 5.2.0 является то, что новая библиотека libstdc ++ ABI теперь выбран по умолчанию.
Если вы получаете ошибки компоновщика о неопределенных ссылках на символы, которые включают типы в пространстве имен std :: __ cxx11 или теге [abi: cxx11], то это, вероятно, указывает на то, что вы пытаетесь связать файлы объектов, которые были скомпилированы с различными значениями для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать свой код со старым ABI.
blockquote>. Если вы вдруг получите ошибки компоновщика при переключении на GCC после 5.1.0 это было бы замечательно.
Существующие ответы do отвечают на вопрос, но не дают решения .
Из readthedocs :
Если файл открыт в текстовом режиме (без
blockquote>b
), только смещения, возвращенныеtell()
, являются законными. Использование других смещений вызывает неопределенное поведение.Это поддерживается документацией , в которой говорится, что:
В текстовых файлах (те, которые открыты без
blockquote>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
Чтобы использовать поиск с текущей позиции и конца, вам нужно открыть текстовый файл в двоичном режиме. См. Этот пример, где я создал файл «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'