[英]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.