복붙노트

[PYTHON] ASCII가 아닌 문자를 제거하고 파이썬을 사용하여 마침표와 공백을 남기려면 어떻게합니까?

PYTHON

ASCII가 아닌 문자를 제거하고 파이썬을 사용하여 마침표와 공백을 남기려면 어떻게합니까?

저는 .txt 파일로 작업하고 있습니다. 비 ASCII 문자가없는 파일의 텍스트 문자열을 원합니다. 그러나 나는 공백과 마침표를 남기고 싶다. 현재, 나는 또한 그것들을 벗겨 내고있다. 코드는 다음과 같습니다.

def onlyascii(char):
    if ord(char) < 48 or ord(char) > 127: return ''
    else: return char

def get_my_string(file_path):
    f=open(file_path,'r')
    data=f.read()
    f.close()
    filtered_data=filter(onlyascii, data)
    filtered_data = filtered_data.lower()
    return filtered_data

공백과 마침표를 남기려면 어떻게해야합니까? 너무 복잡하지는 않지만 상상할 수는 없다고 생각합니다.

해결법

  1. ==============================

    1.다음과 같이 string.printable을 사용하여 인쇄 할 수없는 문자열의 모든 문자를 필터링 할 수 있습니다.

    다음과 같이 string.printable을 사용하여 인쇄 할 수없는 문자열의 모든 문자를 필터링 할 수 있습니다.

    >>> s = "some\x00string. with\x15 funny characters"
    >>> import string
    >>> printable = set(string.printable)
    >>> filter(lambda x: x in printable, s)
    'somestring. with funny characters'
    

    내 컴퓨터의 string.printable에 다음 내용이 들어 있습니다.

    0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
    !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c
    
  2. ==============================

    2.다른 코덱으로 쉽게 변경할 수있는 방법은 encode () 또는 decode ()를 사용하는 것입니다. 귀하의 경우, 당신은 ASCII로 변환하고 지원되지 않는 모든 기호를 무시하고 싶습니다. 예를 들어 스웨덴 문자 å은 ASCII 문자가 아닙니다.

    다른 코덱으로 쉽게 변경할 수있는 방법은 encode () 또는 decode ()를 사용하는 것입니다. 귀하의 경우, 당신은 ASCII로 변환하고 지원되지 않는 모든 기호를 무시하고 싶습니다. 예를 들어 스웨덴 문자 å은 ASCII 문자가 아닙니다.

        >>>s = u'Good bye in Swedish is Hej d\xe5'
        >>>s = s.encode('ascii',errors='ignore')
        >>>print s
        Good bye in Swedish is Hej d
    

    편집하다:

    Python3 : str -> bytes -> str

    >>>"Hej då".encode("ascii", errors="ignore").decode()
    'hej d'
    

    파이썬 2 : 유니 코드 -> str -> 유니 코드

    >>> u"hej då".encode("ascii", errors="ignore").decode()
    u'hej d'
    

    Python2 : str -> unicode -> str (역순으로 디코드 및 인코딩)

    >>> "hej d\xe5".decode("ascii", errors="ignore").encode()
    'hej d'
    
  3. ==============================

    3.@artfulrobot에 따르면, 이것은 filter와 lambda보다 빠르다.

    @artfulrobot에 따르면, 이것은 filter와 lambda보다 빠르다.

    re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string) 
    

    더 많은 예제를 보려면 http://stackoverflow.com/questions/20078816/replace-non-ascii-characters-with-a-singlespace/20079244#20079244를 참조하십시오.

  4. ==============================

    4.귀하의 질문은 모호합니다. 첫 번째 두 문장은 공간과 "마침표"가 비 ASCII 문자라고 믿는다는 것을 의미합니다. 이것은 잘못되었습니다. ord (char) <= 127과 같은 모든 문자는 ASCII 문자입니다. 예를 들어,이 함수는이 문자를 제외합니다! "# $ % & \ '() * +, -. / 그러나 [] {}와 같은 여러 문자가 포함됩니다.

    귀하의 질문은 모호합니다. 첫 번째 두 문장은 공간과 "마침표"가 비 ASCII 문자라고 믿는다는 것을 의미합니다. 이것은 잘못되었습니다. ord (char) <= 127과 같은 모든 문자는 ASCII 문자입니다. 예를 들어,이 함수는이 문자를 제외합니다! "# $ % & \ '() * +, -. / 그러나 [] {}와 같은 여러 문자가 포함됩니다.

    뒤로 물러서서 조금 생각하고 질문을 편집하여 ASCII라는 단어를 언급하지 않고 무엇을하려하는지, 왜 ord (char)> = 128인지는 무시할 수 있다고 생각하는 이유를 알려주십시오. 또한 : 어떤 버전의 파이썬? 입력 데이터의 인코딩은 무엇입니까?

    코드는 전체 입력 파일을 단일 문자열로 읽으며 다른 대답에 대한 사용자 의견 ( "훌륭한 해결책")은 데이터의 개행을 신경 쓰지 않는다는 것을 의미합니다. 파일에 다음과 같은 두 줄이 포함 된 경우

    this is line 1
    this is line 2
    

    결과는 '이것은 라인 1입니다. 라인 2'입니다 ... 당신이 정말로 원하는 것은 무엇입니까?

    더 큰 해결책은 다음과 같습니다 :

  5. ==============================

    5.인쇄 가능한 ASCII 문자가 필요한 경우 코드를 수정해야합니다.

    인쇄 가능한 ASCII 문자가 필요한 경우 코드를 수정해야합니다.

    if ord(char) < 32 or ord(char) > 126: return ''
    

    리턴 및 탭 ( '\ t', '\ n', '\ x0b', '\ x0c'및 '\ r')이 없으면 string.printable (@jterrace의 응답)과 동일하지만 귀하의 질문에 해당하는 범위에 해당하지 않습니다.

  6. ==============================

    6.Fluent Python (Ramalho)을 통해 자신의 방식대로 작업하십시오. 목록 이해력 1-ish-liners는 2 장에서 영감을 얻었습니다.

    Fluent Python (Ramalho)을 통해 자신의 방식대로 작업하십시오. 목록 이해력 1-ish-liners는 2 장에서 영감을 얻었습니다.

    onlyascii = ''.join([s for s in data if ord(s) < 127])
    onlymatch = ''.join([s for s in data if s in
                  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'])
    
  7. from https://stackoverflow.com/questions/8689795/how-can-i-remove-non-ascii-characters-but-leave-periods-and-spaces-using-python by cc-by-sa and MIT license