Saya bekerja dengan file .txt. Saya ingin string teks dari file tanpa karakter non-ASCII. Namun, saya ingin meninggalkan spasi dan titik. Saat ini, saya juga menghapusnya. Berikut kodenya:
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
Bagaimana saya harus memodifikasi onlyascii () untuk meninggalkan spasi dan titik? Saya membayangkan itu tidak terlalu rumit tetapi saya tidak bisa memahaminya.
Jawaban:
Anda dapat memfilter semua karakter dari string yang tidak dapat dicetak menggunakan string.printable , seperti ini:
string.printable di mesin saya berisi:
EDIT: Pada Python 3, filter akan mengembalikan iterable. Cara yang benar untuk mendapatkan string kembali adalah:
sumber
filter
adalah ia mengembalikan iterable. Jika Anda membutuhkan kembali tali (seperti yang saya lakukan karena saya membutuhkan ini ketika melakukan daftar kompresi) kemudian melakukan hal ini:''.join(filter(lambda x: x in string.printable, s)
.re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string)
. Lihat utas ini stackoverflow.com/a/20079244/658497Cara mudah untuk mengubah ke codec yang berbeda, adalah dengan menggunakan encode () atau decode (). Dalam kasus Anda, Anda ingin mengonversi ke ASCII dan mengabaikan semua simbol yang tidak didukung. Misalnya, huruf Swedia å bukan merupakan karakter ASCII:
Edit:
Python3: str -> byte -> str
Python2: unicode -> str -> unicode
Python2: str -> unicode -> str (decode dan encode dalam urutan terbalik)
sumber
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 27
s.decode('utf-8').encode('ascii', errors='ignore')
Menurut @artfulrobot, ini seharusnya lebih cepat daripada filter dan lambda:
Lihat contoh lain di sini http://stackoverflow.com/questions/20078816/replace-non-ascii-characters-with-a-single-space/20079244#20079244
sumber
Pertanyaan Anda ambigu; dua kalimat pertama yang digabungkan menyiratkan bahwa Anda yakin bahwa spasi dan "titik" adalah karakter non-ASCII. Ini salah Semua karakter seperti ord (char) <= 127 adalah karakter ASCII. Misalnya, fungsi Anda mengecualikan karakter ini! "# $% & \ '() * +, -. / Tetapi menyertakan beberapa karakter lain misalnya [] {}.
Harap mundur, berpikir sedikit, dan edit pertanyaan Anda untuk memberi tahu kami apa yang Anda coba lakukan, tanpa menyebutkan kata ASCII, dan mengapa Anda berpikir bahwa karakter seperti ord (char)> = 128 dapat diabaikan. Juga: versi Python yang mana? Apa pengkodean data masukan Anda?
Harap perhatikan bahwa kode Anda membaca seluruh file input sebagai string tunggal, dan komentar Anda ("solusi hebat") untuk jawaban lain menyiratkan bahwa Anda tidak peduli dengan baris baru dalam data Anda. Jika file Anda berisi dua baris seperti ini:
hasilnya akan seperti itu
'this is line 1this is line 2'
... apakah itu yang kamu inginkan?Solusi yang lebih besar akan mencakup:
onlyascii
pengakuan bahwa fungsi filter hanya perlu mengembalikan nilai kebenaran jika argumennya akan dipertahankan:
sumber
Anda dapat menggunakan kode berikut untuk menghapus huruf non-Inggris:
Ini akan kembali
sumber
Jika Anda menginginkan karakter ascii yang dapat dicetak, Anda mungkin harus memperbaiki kode Anda menjadi:
ini setara, dengan
string.printable
(jawaban dari @jterrace), kecuali tidak adanya pengembalian dan tab ('\ t', '\ n', '\ x0b', '\ x0c' dan '\ r') tetapi tidak sesuai dengan kisaran pertanyaan Andasumber
Bekerja dengan cara saya melalui Fluent Python (Ramalho) - sangat disarankan. Pemahaman daftar one-ish-liners yang terinspirasi oleh Bab 2:
sumber