Удаление неизвестных символов из текстового файла - PullRequest
2 голосов
/ 25 ноября 2010

У меня есть большое количество файлов, содержащих данные, которые я пытаюсь обработать с помощью скрипта Python.

Файлы находятся в неизвестной кодировке, и если я открою их в Notepad ++, они содержат числовые данные, разделенные загрузкой «нулевых» символов (представленных как NULL белым на черном фоне в Notepad ++).

Чтобы справиться с этим, я разделяю файл нулевым символом \ x00 и извлекаю только числовые значения, используя следующий скрипт:

stripped_data=[]
for root,dirs,files in os.walk(PATH):
    for rawfile in files:
        (dirName, fileName)= os.path.split(rawfile)
        (fileBaseName, fileExtension)=os.path.splitext(fileName)
        h=open(os.path.join(root, rawfile),'r')
        line=h.read()
        for raw_value in line.split('\x00'):
            try:
                test=float(raw_value)
                stripped_data.append(raw_value.strip())
            except ValueError:  
                pass

Однако в файле иногда присутствуют другие нераспознанные символы (насколько я обнаружил, всегда в самом начале) - они отображаются в Notepad ++ как «EOT», «SUB» и «ETX». Похоже, что они мешают обработке файла в Python - файл заканчивается этими символами, хотя в Notepad ++ явно видно больше данных.

Как удалить все символы, не входящие в ASCII, из этих файлов перед обработкой?

Ответы [ 3 ]

5 голосов
/ 25 ноября 2010

Вы открываете файл в текстовом режиме.Это означает, что первый символ Ctrl-Z считается символом конца файла.Укажите 'rb' вместо 'r' в open ().

1 голос
/ 25 ноября 2010

Функция file.read () будет считывать до EOF.Как вы сказали, он останавливается слишком рано, вы хотите продолжить чтение файла, даже когда нажимаете EOF.Обязательно остановитесь, когда прочитаете весь файл.Это можно сделать, проверив позицию в файле с помощью file.tell () при нажатии EOF и остановке при достижении размера файла (считайте размер файла перед чтением).

Поскольку это довольно сложно, вы можете использовать file.next и перебирать байты.

Чтобы удалить не-ascii символы, вы можете использовать белый список для определенных символов илипроверьте прочитанный байт по диапазону, который вы определяете.Например, это байт между x30 и x39 (число) -> сохранить его / сохранить где-нибудь / добавить в строку.См. Таблицу ASCII .

1 голос
/ 25 ноября 2010

Я не знаю, будет ли это работать наверняка, но вы можете попробовать использовать методы ввода-вывода в модуле codec:

import codec

inFile = codec.open(<SAME ARGS AS 'OPEN'>, 'utf-8')
for line in inFile.readline():
    do_stuff()

Вы можете рассматривать inFile как обычный объект FILE.

Это может или не может помочь вам, но, вероятно, поможет.

[EDIT]

В основном вы замените: h=open(os.path.join(root, rawfile),'r') на h=open(os.path.join(root, rawfile),'r', 'utf-8')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...