Найти - Пользователи
Полная версия: Кодировка файлов. Пожалуйста помогите!
Начало » Python для новичков » Кодировка файлов. Пожалуйста помогите!
1 2 3
nik.iwan2017
Всем привет. 2й день мучаюсь со следующей задачей:
Есть файл (предполагаю, что он в кодировке cp866) мне необходимо прекодировать его в cp1251.
Как мне это сделать? все перепробовал, ничего дельного не получается.
файл с названием 1.5-исходный файл.
vic57
del
vic57
http://patttern.blogspot.ru/2012/07/php-python.html
определился как utf-8, но в нем какие-то служебные символы есть, при чтении ошибки выдает
Rodegast
С чего ты взял что он текстовый? Это бинарный файл, ты его не перекодируешь.
nik.iwan2017
Rodegast
с помощью NotePad++ все нормально перекодируется.
вот файл, который меня полностью устраивает.
nik.iwan2017
vic57
Мне не главное, чтобы все эти кракозябры нормально отобразились, мне главное его нормально считать.
а в исходной кодировке с ним невозможно нормально работать.
vic57
когда-то делал конвертер
 # -*- coding:utf-8 -*-
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class TextConvert(QWidget):
    def __init__(self,parent=None):
        QWidget.__init__(self,parent)
        self.fname = ''
        self.plain = QPlainTextEdit()
        self.plain.setLineWrapMode(0)
        self.lbl = QLabel('<b>'+u'Кодировка:'+'</b>')
        self.box = QComboBox()
        self.btnLoad = QPushButton(u'Открыть')
        self.btnSave = QPushButton(u'Сохранить')
        grid = QGridLayout(self)
        grid.setMargin(1)
        grid.addWidget(self.plain,0,0,10,10)
        grid.addWidget(self.lbl,10,0,1,1)
        grid.addWidget(self.box,10,1,1,3)
        grid.addWidget(self.btnLoad,10,8,1,1)
        grid.addWidget(self.btnSave,10,9,1,1)
        self.load_codecs()
        self.box.currentIndexChanged.connect(self.on_index)
        self.btnLoad.clicked.connect(self.on_load)
        self.btnSave.clicked.connect(self.on_save)
    
    def load_codecs(self):
        lst =['System','UTF-8','cp1251','cp866','KOI8-R']
        self.box.addItems(lst)
        
    def on_index(self):
        self.open_file()
        
    def on_load(self):
        tmp = QFileDialog.getOpenFileName(self,"Load", self.fname,"*.*")
        if not tmp: return
        self.fname = tmp
        self.open_file()
        
    def open_file(self):
        if not self.fname: return
        f = QFile(self.fname)
        if not f.open(QIODevice.ReadOnly): return
        s = QTextStream(f)
        s.setCodec(self.box.currentText().toLocal8Bit())
        self.plain.setPlainText(s.readAll())
        f.close()
        
    def on_save(self):
        tmp = QFileDialog.getSaveFileName(self,"Save", self.fname,"*.*")
        if not tmp: return
        self.fname = tmp
        f = QFile(self.fname)
        if not f.open(QIODevice.WriteOnly): return
        f.write(self.plain.toPlainText().toLocal8Bit())
        f.close()        
if __name__=="__main__":
    app = QApplication([])
    w = TextConvert()
    w.setFont(QFont('times',14))
    w.move(0,0)
    w.resize(800,600)
    w.show()
    sys.exit(app.exec_())
но для автоматической обработки твоего файла нужно формат файла знать - в нем смесь кода и
данных
nik.iwan2017
vic57
Спасибо, сейчас попробую.
Я уже замучался.
есть идеи как удалить из файла все нечитабельные символы?
Например все символы кроме руских, английских букв, пробелов и цифр?
что-то наподобие response, только наоборот. Чтобы удалял все, кроме определенных.
Регулярка тоже не пойдет, потому как какие именно символы встретиться могут, я точно не знаю.
vic57
Qt - crossplatform, так что все можно.
QString, QRegExp, QChar - смотри доки. я не помню точно - cp1251 если 1 байт, можно заменить все символы, не попадающие в диапазон пробелами например. надо в HEX-редакторе посмотреть
можно так
     def open_file(self):
        if not self.fname: return
        f = QFile(self.fname)
        if not f.open(QIODevice.ReadOnly): return
        s = QTextStream(f)
        s.setCodec(self.box.currentText().toLocal8Bit())
        txt = s.readAll()
        f.close()
        txt.replace(QRegExp("[^\w\r\n]")," ")
        self.plain.setPlainText(txt)
заменяет все что не буквы/цифры/перевод строки пробелами
doza_and
nik.iwan2017
есть идеи как удалить из файла все нечитабельные символы?
Например все символы кроме руских, английских букв, пробелов и цифр?

Так в чем сложность? если 866 в 1251 то просто конвертируете а на выход отдаете только нужные вам буквы
например
 li =re.findall("[A-Za-z0-9 А-Яа-я]+".data)
" ".join(li)
Поправьте выражение может еще какие буквы потребуются типа е с точками.

Использовать для этого Qt? Отфильтровать буквы и без него можно.

Для такой операции вообщето translate предназначен
https://docs.python.org/2/library/string.html#string.translate
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB