Estou trabalhando com um arquivo .txt. Quero uma seqüência de caracteres do texto do arquivo sem caracteres não ASCII. No entanto, quero deixar espaços e pontos. No momento, estou tirando isso também. Aqui está o código:
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
Como devo modificar onlyascii () para deixar espaços e pontos? Imagino que não seja muito complicado, mas não consigo descobrir.
Respostas:
Você pode filtrar todos os caracteres da string que não podem ser impressos usando string.printable , assim:
string.printable em minha máquina contém:
EDIT: No Python 3, o filtro retornará um iterável. A maneira correta de obter uma string de volta seria:
fonte
filter
é que ele retorna um iterável. Se você precisa de uma volta string (como eu fiz porque eu precisava disso ao fazer compressão lista), em seguida, faça o seguinte:''.join(filter(lambda x: x in string.printable, s)
.re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string)
. Veja este tópico stackoverflow.com/a/20079244/658497Uma maneira fácil de mudar para um codec diferente é usando encode () ou decode (). No seu caso, você deseja converter para ASCII e ignorar todos os símbolos que não são suportados. Por exemplo, a letra sueca å não é um caractere ASCII:
Editar:
Python3: str -> bytes -> str
Python2: unicode -> str -> unicode
Python2: str -> unicode -> str (decodificar e codificar na ordem reversa)
fonte
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 27
s.decode('utf-8').encode('ascii', errors='ignore')
De acordo com @artfulrobot, isso deve ser mais rápido do que filtrar e lambda:
Veja mais exemplos aqui http://stackoverflow.com/questions/20078816/replace-non-ascii-characters-with-a-single-space/20079244#20079244
fonte
Sua pergunta é ambígua; as duas primeiras sentenças juntas implicam que você acredita que espaço e "ponto" são caracteres não ASCII. Isso está incorreto. Todos os caracteres como ord (char) <= 127 são caracteres ASCII. Por exemplo, sua função exclui esses caracteres! "# $% & \ '() * +, -. / Mas inclui vários outros, por exemplo [] {}.
Por favor, dê um passo para trás, pense um pouco e edite sua pergunta para nos dizer o que você está tentando fazer, sem mencionar a palavra ASCII, e por que você acha que caracteres como ord (char)> = 128 são ignoráveis. Além disso: qual versão do Python? Qual é a codificação de seus dados de entrada?
Observe que seu código lê todo o arquivo de entrada como uma única string, e seu comentário ("ótima solução") para outra resposta implica que você não se preocupa com novas linhas em seus dados. Se o seu arquivo contém duas linhas como esta:
o resultado seria
'this is line 1this is line 2'
... é isso que você realmente quer?Uma solução maior incluiria:
onlyascii
reconhecimento de que uma função de filtro precisa apenas retornar um valor verdadeiro se o argumento for retido:
fonte
Você pode usar o seguinte código para remover letras que não sejam do inglês:
Isso vai voltar
fonte
Se você quiser caracteres ascii imprimíveis, provavelmente deve corrigir seu código para:
isto é equivalente a
string.printable
(resposta de @jterrace), exceto pela ausência de retornos e tabulações ('\ t', '\ n', '\ x0b', '\ x0c' e '\ r'), mas não corresponde a o alcance da sua perguntafonte
Trabalhando meu caminho através do Fluent Python (Ramalho) - altamente recomendado. Liners de compreensão de lista inspirados no Capítulo 2:
fonte