Open () и codecs.open () в Python 2.7 ведут себя странно

У меня есть текстовый файл с первой строкой символов Юникода и всеми другими строками в ASCII. Я пытаюсь прочитать первую строку как одну переменную, а все остальные – как другую. Однако, когда я использую следующий код:

# -*- coding: utf-8 -*- import codecs import os filename = '1.txt' f = codecs.open(filename, 'r3', encoding='utf-8') print f names_f = f.readline().split(' ') data_f = f.readlines() print len(names_f) print len(data_f) f.close() print 'And now for something completely differerent:' g = open(filename, 'r') names_g = g.readline().split(' ') print g data_g = g.readlines() print len(names_g) print len(data_g) g.close() 

Я получаю следующий вывод:

 <open file '1.txt', mode 'rb' at 0x01235230> 28 7 And now for something completely differerent: <open file '1.txt', mode 'r' at 0x017875A0> 28 77 

Если я не использую readlines (), весь файл читает не только первые 7 строк как в codecs.open (), так и в open ().

Почему такое происходит? И почему файл codecs.open () читается в двоичном режиме, несмотря на параметр 'r'?

Обновление: это оригинальный файл: http://www1.datafilehost.com/d/0792d687

One Solution collect form web for “Open () и codecs.open () в Python 2.7 ведут себя странно”

Поскольку вы .readline() использовали .readline() , файл codecs.open() заполнил буфером строк; последующий вызов .readlines() возвращает только буферные строки.

Если вы снова вызываете .readlines() , остальные строки возвращаются:

 >>> f = codecs.open(filename, 'r3', encoding='utf-8') >>> line = f.readline() >>> len(f.readlines()) 7 >>> len(f.readlines()) 71 

.readline() – не смешивать .readline() и .readlines() :

 f = codecs.open(filename, 'r3', encoding='utf-8') data_f = f.readlines() names_f = data_f.pop(0).split(' ') # take the first line. 

Такое поведение действительно является ошибкой; разработчики Python знают об этом, см. вопрос 8260 .

Другой вариант – использовать io.open() вместо codecs.open() ; библиотека io – это то, что использует Python 3 для реализации встроенной функции open() и является гораздо более надежным и универсальным, чем модуль codecs .

  • Почему символ ID 160 не распознается как Unicode в PDFMiner?
  • Сравнение строк и юникодов в Python 2.7.5
  • Ошибки Unicode Python, синхронизация среды разработки и производства
  • как бороться с ® в url для urllib2.urlopen?
  • Как печатать символ Unicode в Python?
  • UnicodeEncodeError при выборе URL-адреса
  • base64 кодирует строки unicode в python 2.7
  • Удаление символов unicode \ u2026 в строке в python2.7
  • Python - лучший язык программирования в мире.