簡體   English   中英

非ASCII字符消除而無需更改字符數

[英]Non-ASCII character elimination without changing char count

我有固定寬度格式的數據,我想只使用ASCII字符轉換為python /在python中定界的制表符。 我對編碼了解得很少,原始文件中的某些字符是非ASCII的。 我可以很容易地用占位符替換這些字符(我不在乎它們是什么),但這會使字符計數減少。 隨后,我嘗試使用單個占位符替換多個1個以上占位符的每個序列,但是在某些情況下會依次出現特殊字符。

我不知道原始文件使用了哪種編碼,但是如果它是從MS單詞復制/粘貼的,並且具有½,«等字符,我不會感到驚訝。

例如,考慮以下文件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字符旁邊的字符。

我是否錯過了一種非常簡單的方法來做到這一點?

提前致謝。

鑒於您的簡單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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM