Как найти / заменить непечатаемые / не ascii символы с помощью Python 3? - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть файл, некоторые строки в файле .csv, которые мешают импорту базы данных из-за прикольных символов в некотором поле в строке.

Я искал, нашел статьи о том, как заменить не-ascii символы в Python 3, но ничего не работает.

Когда я открываю файл в vi и выполняю: set list, в конце строки, где ее не должно быть, стоит $, и ^ I ^Я в начале следующей строки.Две строки должны быть одной соединенной линией и не ^ я там.Я знаю, что $ является концом строки '\ n' и пытался заменить их, но ничего не работает.

Я не знаю, что представляет собой ^ I, возможно, вкладка.


Я пробовал эту функцию безрезультатно:

def remove_non_ascii(text):
    new_text = re.sub(r"[\n\t\r]", "", text)
    new_text = ''.join(new_text.split("\n"))
    new_text = ''.join([i if ord(i) < 128 else ' ' for i in new_text])
    new_text = "".join([x for x in new_text if ord(x) < 128])
    new_text = re.sub(r'[^\x00-\x7F]+', ' ', new_text)
    new_text = new_text.rstrip('\r\n')
    new_text = new_text.strip('\n')
    new_text = new_text.strip('\r')
    new_text = new_text.strip('\t')
    new_text = new_text.replace('\n', '')
    new_text = new_text.replace('\r', '')
    new_text = new_text.replace('\t', '')
    new_text = filter(lambda x: x in string.printable, new_text)
    new_text = "".join(list(new_text))

    return new_text

Есть ли какой-нибудь инструмент, который точно покажет мне, что это за оскорбительный символ, и затем найдет способ заменить его?

Я открываю файл следующим образом (файл .csv был сохранен как UTF-8)

f_csv_in = open(csv_in, "r", encoding="utf-8")

Ниже приведены две строки, которые должны быть одной с видимой проблемой, не являющейся символами ascii.

Эти две строки должны быть одной строкой.Обратите внимание на $ в конце строки 37, а строка 38 начинается с ^ I ^ I.

Часть проблемы, которую показывает vi, заключается в том, что в строке 37 есть новая строка $, где я надеваюне хочу, чтобы это было.Это должна быть одна строка.

37 Cancelled,01-19-17,,basket,00-00-00,00-00-00,,,,98533,SingleSource,,,17035 Cherry Hill Dr,"L/o 1-19-17 @ 11:45am$
38 ^I^IVictorville",SAN BERNARDINO,CA,92395,,,,,0,,,,,Lock:6111 ,,,No,No,,0.00,0.00,No,01-19-17,0.00,0.00,,01-19-17,00-00-00,,provider,,,Unread,00-00-00,,$

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

В случае непечатных символов во встроенном строковом модуле есть несколько способов отфильтровать непечатные или не ascii символы, например.с функциональностью isprintable().
Краткий способ фильтрации всей строки представлен ниже

>>> import string
>>>
>>> str1 = '\nsomestring'
>>> str1.isprintable()
False
>>> str2 = 'otherstring'
>>> str2.isprintable()
True
>>>
>>> res = filter(lambda x: x in string.printable, '\x01mystring')
>>> "".join(list(res))
'mystring'

Этот вопрос ранее обсуждался по SO,но есть много способов сделать что-то, поэтому я понимаю, что это может сбивать с толку, так как вы можете использовать что угодно, от регулярных выражений до str.translate()

Еще одна вещь, которую можно сделать, это взятьпосмотрите на Unicode Categories и отфильтруйте ваши данные на основе необходимого вам набора символов.

0 голосов
/ 26 февраля 2019

Похоже, что у вас есть файл CSV, который содержит значения в кавычках, то есть такие значения, как встроенные запятые или символы новой строки, которые должны быть заключены в кавычки, чтобы читатели CSV обрабатывали их правильно.

Если вы посмотрите на данные примера, вы увидите, что есть открывающая двойная кавычка, но нет закрывающей двойной кавычки в конце первой строки, и закрывающая двойная кавычка без открывающей двойной кавычки во второй строке, указывающая, что кавычки содержатзначение со встроенной новой строкой.

Тот факт, что строки разбиты на две части, может быть артефактом приложения, используемого для их просмотра, или кода, который их обрабатывает: если программное обеспечение не понимает цитирование CSVон будет предполагать, что каждый символ новой строки обозначает новую строку.

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

Этот фрагмент перезаписывает файл, удаляя встроенные запятые, переводы строк и табуляции, и дает указание автору записи не заключать в кавычки какие-либо значения.Сбой с сообщением об ошибке _csv.Error: need to escape, but no escapechar set, если он найдет значение, которое необходимо экранировать.В зависимости от ваших данных, вам может понадобиться настроить шаблон регулярных выражений.

with open('lines.csv') as f, open('fixed.csv', 'w') as out:
    reader = csv.reader(f)
    writer = csv.writer(out, quoting=csv.QUOTE_NONE)
    for line in reader:
        new_row = [re.sub(r'\t|\n|,', ' ', x) for x in line]
        writer.writerow(new_row)
0 голосов
/ 08 февраля 2019

Простой способ удаления символов, отличных от ascii, может быть следующим:

new_text = "".join([c for c in text if c.isascii()])

Примечание: если вы читаете этот текст из файла, убедитесь, что вы читаете его в правильной кодировке

...