2015-12-25 8 views
1

У меня есть данные в формате фиксированной ширины. Я хотел бы преобразовать в CSV/tab, разделенные на питоне, используя только символы ASCII. Я очень мало знаю о кодировках, и некоторые из символов исходного файла не являются ASCII. Я могу заменить их заполнителями достаточно легко (мне все равно, что это такое), но это бросает героя. Я попытался впоследствии заменить каждую последовательность из более чем одного заполнителя на один заполнитель, но есть ситуации, когда специальные символы встречаются последовательно.Удаление символов без символов ASCII без изменения количества символов

Я не знаю, какая кодировка используется для исходного файла, но я не удивлюсь, если он был копировать/вставить из MS Word и показывает символы, такие как ½, «и т.д.

Например, рассмотрим следующий файл test.txt, который содержит поля длины 1, 2 и 1, разделенных пробелом (в том числе задней новой линии):

1 AA A 
2 BB B 
3 ¾ C 
4 «¾ D 
5 C E 

простой Python скрипт:

with open('./test.txt', 'r') as f: 
    for line in f: 
     print len(line) 

выходы

7 
7 
8 
9 
7 

Я попытался заменить символы обижая, но так как они читали два, это приводит к двум заполнителей вставленными. Затем я могу заменить несколько заполнителей одним заполнителем ... но затем последовательные заполнители бросают счет.

import re 
r = re.compile(r'\?\?+') 

with open('./test.txt', 'r') as f, \ 
    open('./test_out1.txt', 'w') as w1, \ 
    open('./test_out2.txt', 'w') as w2: 
    for line in f: 
    q1 = line.decode('ascii', 'replace').replace(u'\ufffd', '?') 
    w1.write(q1) 
    q2 = r.sub('?', q1) 
    w2.write(q2) 

Результаты: test_out1.txt

1 AA A 
2 BB B 
3 ?? C 
4 ???? D 
5 C E 

test2.txt

1 AA A 
2 BB B 
3 ? C 
4 ? D 
5 C E 

Это, очевидно, также будут иметь проблемы, если есть когда-либо фактического '?' символ рядом с символом, отличным от ASCII в источнике.

У меня отсутствует действительно простой способ сделать это?

Заранее спасибо.

+0

Скорее всего у вас есть * не-ASCII символы * в файле, закодированную с Codepage Windows, (например, 1252), используя 128 оставшихся позиций, доступных в 1-байтовом кодеке. –

+0

Можете ли вы предоставить образец?Как вы заменяете символы, отличные от ASCII, какие заполнители вы используете для этого броска вашего счета? –

ответ

0

Учитывая, что ваш простой скрипт python выводит разные длины строк, вы имеете дело с многобайтовой кодировкой некоторого описания.

Лучшим подходом было бы определить кодировку файла. Если данные должны быть фиксированной шириной, это будет кодировка, в которой каждая строка будет равна числу символов (в отличие от байтов).

Например:

$ cat test.txt 
1 AA A 
2 BB B 
3 ¾ C 
4 «¾ D 
5 C E 

$ python3 
Python 3.5.0 
>>> with open("test.txt", "r", encoding="utf-8") as f: 
...  for line in f: 
...   print(len(line)) 
... 
7 
7 
7 
7 
7 

Если вы получаете различные длины с utf-8, попробуйте другие многобайтовые кодировки, пока не найдете правильный. После того, как вы определили входное кодирование, вы можете легко вывести файл с не-ASCII символов заменены заполнителями:

$ python3 
Python 3.5.0 
>>> with open("test.txt", "r", encoding="utf-8") as infile: 
...  with open("output.txt", "w", encoding="ascii", errors="replace") as outfile: 
...   for line in infile: 
...    outfile.write(line) 

$ cat output.txt 
1 AA A 
2 BB B 
3 ? C 
4 ?? D 
5 C E 
Смежные вопросы