Python читает из файла и удаляет символы не-ascii
У меня есть следующая программа, которая читает файл слово за словом и снова записывает слово в другой файл, но без символов не-ascii из первого файла.
import unicodedata
import codecs
infile = codecs.open('d.txt','r',encoding='utf-8',errors='ignore')
outfile = codecs.open('d_parsed.txt','w',encoding='utf-8',errors='ignore')
for line in infile.readlines():
for word in line.split():
outfile.write(word+" ")
outfile.write("\n")
infile.close()
outfile.close()
Единственная проблема, с которой я столкнулся, заключается в том, что с этим кодом он не печатает новую строку во второй файл (d_parsed). Любые подсказки
Ответы
Ответ 1
codecs.open()
не поддерживает универсальные символы новой строки, например, не переводит \r\n
в \n
во время чтения в Windows.
Вместо этого используйте io.open()
:
#!/usr/bin/env python
from __future__ import print_function
import io
with io.open('d.txt','r',encoding='utf-8',errors='ignore') as infile, \
io.open('d_parsed.txt','w',encoding='ascii',errors='ignore') as outfile:
for line in infile:
print(*line.split(), file=outfile)
btw, если вы хотите удалить символы, отличные от ascii, вы должны использовать ascii
вместо utf-8
.
Если входная кодировка совместима с ascii (например, utf-8), вы можете открыть файл в двоичном режиме и использовать bytes.translate()
для удаления символов, отличных от ascii:
#!/usr/bin/env python
nonascii = bytearray(range(0x80, 0x100))
with open('d.txt','rb') as infile, open('d_parsed.txt','wb') as outfile:
for line in infile: # b'\n'-separated lines (Linux, OSX, Windows)
outfile.write(line.translate(None, nonascii))
Он не нормализует пробелы, как первый пример кода.
Ответ 2
Из docs для codecs.open
:
Примечание. Файлы всегда открываются в двоичном режиме, даже если не указан бинарный режим. Это делается для предотвращения потери данных из-за кодирования с использованием 8-битных значений. Это означает, что автоматическое преобразование "\n" не выполняется при чтении и записи.
Я предполагаю, что вы используете Windows, где последовательность новой строки на самом деле '\r\n'
. Файл, открытый в текстовом режиме, автоматически выполняет преобразование с \n
в \r\n
, но это не происходит с codecs.open
.
Просто напишите "\r\n"
вместо "\n"
, и он должен работать нормально, по крайней мере, в Windows.
Ответ 3
используйте кодеки, чтобы открыть файл CSV, а затем вы можете избежать не-ASCII символов
import codecs
reader = codecs.open("example.csv",'r', encoding='ascii', errors='ignore')
for reading in reader:
print (reader)