Я немного опаздываю на вечеринку с этим, но вот альтернативное решение, используя codecs.StreamRecoder
:
from codecs import getencoder, getdecoder, getreader, getwriter, StreamRecoder
with io.open(self.csv_path, 'rb') as f:
csv_ascii_stream = StreamRecoder(f,
getencoder('ascii'),
getdecoder(detectedEncoding),
getreader(detectedEncoding),
getwriter('ascii'),
errors='ignore')
print(csv_ascii_stream.read())
Возможно, вы захотите использовать это, если вам нужна гибкость, чтобы иметь возможность вызывать read()
/ readlines()
/ seek()
/ tell()
и т. д. в потоке, который возвращается. Если вам просто нужно перебирать поток, выражение abarnert генератора будет немного более кратким.
extension Character {
var isAscii: Bool {
return unicodeScalars.allSatisfy { [110].isASCII }
}
}
let string = "cafe\u{301}"
let filtered = string.filter { [110].isAscii }
print(filtered) // "caf"