Е
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.                                ѓ€‘: ‚Ё¤ ЇҐаҐ¤ ў Ґ¬ле ¤ ­­ле

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
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

    Комментарии

    Только авторизованные пользователи могут публиковать комментарии.
    Пожалуйста, авторизуйтесь или зарегистрируйтесь
    25 мая 2019 г. 16:20
    Андрей Янкович

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

    • Результат:93баллов,
    • Очки рейтинга8
    m
    19 мая 2019 г. 1:49
    mahhaki

    Qt - Тест 001. Сигналы и слоты

    • Результат:78баллов,
    • Очки рейтинга2
    S
    17 мая 2019 г. 13:14
    SunBro

    Qt - Тест 001. Сигналы и слоты

    • Результат:42баллов,
    • Очки рейтинга-8
    Последние комментарии
    21 мая 2019 г. 20:10
    Дмитрий

    Приветствую! Я думаю дойдёт и до этого, но пока изучать его у меня нет желания.
    20 мая 2019 г. 19:20
    Евгений Легоцкой

    Добрый день! Вы не думали разместить репозиторий проекта на GitHub?
    P.
    18 мая 2019 г. 14:03
    PELMYACH .

    Спасибо большое! Вскоре буду разбираться!
    18 мая 2019 г. 9:13
    Евгений Легоцкой

    Добрый день! Отнимать значение общего счётчика можно в деструкторе класса кнопки QDynamicButton::~QDynamicButton(){ ResID--;} При этом я бы ещё переустанавливал значения вс...
    P.
    14 мая 2019 г. 22:33
    PELMYACH .

    Здравствуйте!А не подскажите, как можно при удалении какой либо кнопки, у щётчика отнять значение?Дабы например четвёртой кнопке соответствовал ID 4, а не 5 скажем
    Сейчас обсуждают на форуме
    24 мая 2019 г. 6:48
    Евгений Легоцкой

    Если там будут только перечисления внутри namespace, то жа, достаточно будет заголовочного файла
    24 мая 2019 г. 6:28
    Андрей Янкович

    работает любой http сервер, и можно использовать обсалютно любой портпример <RemoteRepositories> <Repository> <Url>http://178.124.160.6:3030/A/B&l...;
    23 мая 2019 г. 14:40
    Михаиллл

    Попробовал сделать этот запрос по http и получил json файл. request.setUrl(QUrl("https://jsonplaceholder.typicode.com/todos/1")); Как Вы думаете, почему https не работает и как это и...
    23 мая 2019 г. 10:42
    Михаиллл

    Спасибо, помогло.
    23 мая 2019 г. 6:31
    Евгений Легоцкой

    Для задач и граф-то не нужен. Достаточно будет таблицы в локальной базе данных SQLite, в которой указывается задача, время и т.д. В этом разделе есть примеры по работа с базой д...

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

    EVILEG
    О нас
    Услуги
    Присоединяйтесь к нам
    © EVILEG 2015-2019
    Рекомендует хостинг TIMEWEB