我有固定宽度格式的数据我想转换为仅使用ASCII字符在python中分隔的CSV /制表符。我对编码知之甚少,原始文件中的一些字符是非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
我已尝试更换有问题的字符,但由于它们被读为2,因此会导致插入两个占位符。然后我可以用一个占位符替换多个占位符......但是然后连续占位符会抛出计数。
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 :(得分: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