Е
24 вересня 2018 р. 22:47

Чтение файлов в 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

Вам це подобається? Поділіться в соціальних мережах!

18
Evgenii Legotckoi
  • 25 вересня 2018 р. 13:20

День добрый!

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

    Е
    • 25 вересня 2018 р. 21:57

    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_())

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

        Е
        • 27 вересня 2018 р. 16:15
        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)

            Е
            • 27 вересня 2018 р. 16:25
            1. codecs подчеркивается
              1. import codecs
                Е
                • 27 вересня 2018 р. 16:35
                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()
                  Е
                  • 27 вересня 2018 р. 16:35

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

                    1. import codecs

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

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

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

                    1. app = QtWidgets.QApplication(sys.argv)
                      Е
                      • 27 вересня 2018 р. 16:46

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

                        А что пишет?

                          Evgenii Legotckoi
                          • 27 вересня 2018 р. 16:55

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

                          1. f = codecs.open(filename, encoding="utf-8")
                            Е
                            • 27 вересня 2018 р. 16:57

                            Process finished with exit code 3

                              Е
                              • 27 вересня 2018 р. 17:02

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

                                Е
                                • 29 вересня 2018 р. 11:47

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

                                1. f = codecs.open (strxList[jk], 'r', encoding='cp866')
                                  Е
                                  • 29 вересня 2018 р. 15:40

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

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

                                      Коментарі

                                      Only authorized users can post comments.
                                      Please, Log in or Sign up
                                      • Останні коментарі
                                      • Evgenii Legotckoi
                                        16 квітня 2025 р. 17:08
                                        Благодарю за отзыв. И вам желаю всяческих успехов!
                                      • IscanderChe
                                        12 квітня 2025 р. 17:12
                                        Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                                      • AK
                                        01 квітня 2025 р. 11:41
                                        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                                      • Evgenii Legotckoi
                                        09 березня 2025 р. 21:02
                                        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                                      • VP
                                        09 березня 2025 р. 16:14
                                        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…