Подтвердить что ты не робот

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). Любые подсказки

4b9b3361

Ответ 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)