Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
Е
24 сентября 2018 г. 16: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.                                ѓ€‘: ‚Ё¤ ЇҐаҐ¤ ў Ґ¬ле ¤ ­­ле

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

18

День добрый!

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

0
Е

Вот код:


import sys

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

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

0
Е
  • Вот здесь:
  • 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()
  • strxList - это список файлов считанный с textedit, когда начинаю перебирать каждый элемент списка нормальные файлы читаются и выводятся в консоль и textedit, а когда попадается файл с "абракадаброй" программа вылетает 
    0

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

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

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

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

    0
    Е
    codecs подчеркивается
    0
    import codecs
    0
    Е
    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()
    0
    Е

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

    0
    import codecs

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

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

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

    app = QtWidgets.QApplication(sys.argv)
    0
    Е

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

    0

    А что пишет?

    0

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

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

    Process finished with exit code 3

    0
    Е

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

    0
    Е

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

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

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

    0

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

    0

    Комментарии

    Только авторизованные пользователи могут публиковать комментарии.
    Пожалуйста, авторизуйтесь или зарегистрируйтесь
    НБ
    15 февраля 2019 г. 13:09
    Николай Булахтин

    C++ - Тест 003. Условия и циклы

    • Результат:50баллов,
    • Очки рейтинга-4
    НБ
    15 февраля 2019 г. 13:03
    Николай Булахтин

    C++ - Тест 002. Константы

    • Результат:25баллов,
    • Очки рейтинга-10
    НБ
    15 февраля 2019 г. 13:01
    Николай Булахтин

    C++ - Тест 001. Первая программа и типы данных

    • Результат:73баллов,
    • Очки рейтинга1
    Последние комментарии
    V
    14 февраля 2019 г. 18:41
    Vlad15007

    Спасибо огромное! Заработало!
    А
    12 февраля 2019 г. 9:26
    Александр90

    Сам разборался, спасибо.
    А
    12 февраля 2019 г. 8:19
    Александр90

    День добрый! Можешь выложить форму mainwindow.ui от урока? Заранее спасибо
    11 февраля 2019 г. 10:51
    Евгений Легоцкой

    Нет, у меня проблема с жёстким диском случилась, занимался восстановлением ПК, ещё пару вечеров придётся этим заниматься, увы.
    Сейчас обсуждают на форуме
    15 февраля 2019 г. 21:22
    IscanderChe

    Доброй ночи.Скромно напоминаю о своём вопросе...
    15 февраля 2019 г. 15:36
    Евгений Легоцкой

    Ну я тут нашёл одно решение, но сам его не проверял. Вам нужно помещать фамилии скорее всего в ячейки заголовка, и потом просто перерисовывать их QHeaderView * header = m_ui->tableWidget...
    15 февраля 2019 г. 7:53
    Евгений Легоцкой

    Добрый день! Не работал с remoteobjects, поэтому глянул документацию, чтобы рассмотреть, что это за зверь. После просмотра документации сложилось стойкой впечатление, что это вполне возм...
    m
    14 февраля 2019 г. 18:28
    mr_roman

    Нашел решение на Java. Удалось интегрировать в проект сервиса на Qt, теперь из Qt запускаю Java-код акселерометра.
    14 февраля 2019 г. 11:00
    Евгений Легоцкой

    ok. I see. You changed related name Try this {% if goal.joined.all|user_in:request.user %}
    Присоединяйтесь к нам в социальных сетях

    Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы