Чтение файлов в python

Добрый вечер Евгений и форумчане! Столкнулся с проблемой чтения файлов в python: файлы с обычным текстом в формате las и txt читаются, например:

~Version information
VERS.                            1.20: CWLS LAS  -  VERSION 1.20
WRAP.                              NO: One line per depth step

~Well information

Но если текст такого вида (с абракадаброй):

~Version information block
VERS.                             1.20:Ќ з «м­ п Ј«гЎЁ­  § ¬Ґа
WRAP.                       137.60:Љ®­Ґз­ п Ј«гЎЁ­  § ¬Ґа
TYPE.                                ѓ€‘: ‚Ё¤ ЇҐаҐ¤ ў Ґ¬ле ¤ ­­ле

программа вылетает. Не подскажите как лечится?

2

Do you like it? Share on social networks!

18
Evgenii Legotckoi
  • Sept. 25, 2018, 1:20 p.m.

День добрый!

А киньте код вашей программы, который отвечает за чтение. Возможно, что вы как-то криво читаете кодировку. Может там кодировка, которая имеет меньше байт на символ, которую вы используете, поэтому и вылетает за пределы текстового массива указатель при чтении.


    1. Вот код:


    import sys

    1. from re import match

      from vira import *
      from PyQt5 import QtCore, QtGui, QtWidgets
      from PyQt5.QtWidgets import (QDialog, QFileDialog, QMessageBox, QLineEdit, QProgressBar, QProgressDialog)
      from PyQt5.QtCore import QDir, QDirIterator


      class MyWin(QtWidgets.QMainWindow):
      def __init__(self, parent=None):
      QtWidgets.QWidget.__init__(self, parent)
      self.ui = Ui_MainWindow()
      self.ui.setupUi(self)

      # Вешаем на кнопку функцию Open
      self.ui.pushButton.clicked.connect(self.Open)
      self.ui.pushButton_2.clicked.connect(self.close)

      def Open(self):
      self.ui.textEdit.clear()
      files, _ = QFileDialog.getOpenFileNames(self, "Выбрать файлы", "/home", "*.las *.txt")
      hjh = list(filter(lambda x: x != '*.las *.txt', files))
      myString = '\n'.join(hjh)
      self.ui.textEdit.setText(myString)
      if self.ui.comboBox.currentIndex() == 0:
      strx = self.ui.textEdit.toPlainText()
      strxList = strx.split('\n')

      for jk in range(0, len(strxList), 1):
      print(strxList[jk])
      self.ui.textEdit.append(str(strxList[jk]))
      f = open(strxList[jk], 'r')
      for line in f:
      print(line)
      self.ui.textEdit.append(line)
      f.close()

      if __name__ == "__main__":
      app = QtWidgets.QApplication(sys.argv)
      myapp = MyWin()
      myapp.show()
      sys.exit(app.exec_())

      Извиняюсь, не проверил код у себя ещё. В каком именно месте падает? Вы определили это?

        1.  
      • Вот здесь:
        1.  
      • for jk in range(0, len(strxList), 1):
      • print(strxList[jk])
      • self.ui.textEdit.append(str(strxList[jk]))
      • f = open(strxList[jk], 'r')
      • for line in f:
      • print(line)
      • self.ui.textEdit.append(line)
      • f.close()
        1. strxList - это список файлов считанный с textedit, когда начинаю перебирать каждый элемент списка нормальные файлы читаются и выводятся в консоль и textedit, а когда попадается файл с "абракадаброй" программа вылетает 

          Похоже, что здесь сам вывод print у Python крашится из-за кодировки символов.

          Попрбуйте установить кодировку для потока вывода.

          Что вроде такого может быть

          1. UTF8Writer = codecs.getwriter('utf8')
          2. sys.stdout = UTF8Writer(sys.stdout)

            1. codecs подчеркивается
              1. import codecs
                1. import codecs
                  for jk in range(0,len(strxList),1):
                  print(strxList[jk])
                  self.ui.textEdit.append(str(strxList[jk]))
                  UTF8Writer = codecs.getwriter ('utf8')
                  sys.stdout = UTF8Writer (sys.stdout)
                  f = open(strxList[jk], 'r')
                  for line in f:
                  print(line)
                  self.ui.textEdit.append(line)
                  f.close()

                  Я правильно скомпоновал код?

                    1. import codecs

                    Я бы добавил в самом начале файла

                    1. UTF8Writer = codecs.getwriter ('utf8')
                    2. sys.stdout = UTF8Writer (sys.stdout)

                    А это я думаю, стоит добавить перед ээтой строкой

                    1. app = QtWidgets.QApplication(sys.argv)

                      Программа вообще не запускается

                        А что пишет?

                          Evgenii Legotckoi
                          • Sept. 27, 2018, 4:55 p.m.

                          Так, а если тогда просто файл открывать с учётом кодировки?

                          1. f = codecs.open(filename, encoding="utf-8")

                            Process finished with exit code 3

                              Опять вылетает

                                Решение найдено:

                                1. f = codecs.open (strxList[jk], 'r', encoding='cp866')

                                  Спасибо Евгений Вам за то что направили на путь истинный!

                                    Пожалуйста, успехов.

                                      Comments

                                      Only authorized users can post comments.
                                      Please, Log in or Sign up
                                      • Last comments
                                      • Evgenii Legotckoi
                                        March 9, 2025, 9:02 p.m.
                                        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                                      • VP
                                        March 9, 2025, 4:14 p.m.
                                        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                                      • ИМ
                                        Nov. 22, 2024, 9:51 p.m.
                                        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                      • Evgenii Legotckoi
                                        Oct. 31, 2024, 11:37 p.m.
                                        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                      • A
                                        Oct. 19, 2024, 5:19 p.m.
                                        Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html