我有一个包含多行的文本文件。 一行的示例是: 3578312 10 3 7 8
但是分隔符是[0001](在一个方框中)而不是传统的分隔符,如逗号或制表符等。
我在python中使用numpy来读取这个,有没有人知道分隔符应该是什么? 我搜索了文档,但没有得到任何东西。
import numpy as np
read_data= np.genfromtxt(fname, delimiter='\u0001')
给出:
array([ nan, nan, nan, ..., nan, nan, nan])
但是当我将null分隔符物理转换为逗号分隔符时,我可以用正确的值读取它。
答案 0 :(得分:4)
我知道\ u0001不是正确的分隔符。这只是一个假设的例子。我无法在此处粘贴分隔符,它看起来像一个封闭的方框,以2行2列的方式使用0001。
很可能,\u0001
在某种意义上是正确的分隔符,你只是做错了。
有些字体使用这样的符号来显示非打印控制字符,因此0001-in-a-box是U + 0001的表示,又称起始标题,又名控制-A。*
第一个问题是Python 2.x文字'\u0001'
没有指定该字符。您无法在\u
文字中使用str
个转义符,只能使用unicode
个文字。 The docs解释了这一点,但如果你仔细想想就行了。因此,文字'\u0001'
不是源文件编码中的字符U + 0001,而是六个单独的字符(反斜杠,一个字母和四个数字)。
那么,你能使用u'\u0001'
吗?嗯,是的,但是你需要将文本文件解码为Unicode,这可能不合适。它根本不是一个文本文件,它是一个二进制文件。关键是以这种方式看待它。
你的文本编辑器不能这样做,因为它是......好吧,一个文本编辑器,因此它将你的二进制文件解码为就像是ASCII(或者UTF-8,Latin-1, cp1252,无论如何)文本,然后显示生成的Unicode,这就是你看到你的字体表示U + 0001的原因。但Python允许您直接处理二进制数据;这就是str
的作用。
那么,文件中的实际字节是多少?如果你这样做:
b = f.readline()
print repr(b)
您可能会看到类似这样的内容:
'357812\x0110\x0113\x017\x018\n'
这就是关键:你想要的实际分隔符是'\x01'
。**
当然你可以使用u'\u0001'.encode('Latin-1')
,或者你的源文件所处的编码......但这只是愚蠢的。你知道要匹配的字节,为什么要尝试提出一个表示该字节的表达式而不是仅指定它?
如果你愿意,你也可以将控件-A分隔符转换为更像传统的逗号:
lines = (line.replace('\x01', ',') for line in file)
但是没有理由花费额外的努力来解决这个问题。特别是如果某些列可能包含可能包含逗号的文本...那么你必须做一些事情,例如在不在引号内的每个原始逗号前加一个反斜杠,或引用每个字符串列,或者其他什么,然后才能替换带逗号的分隔符。
*从技术上讲,它应该显示为一个非组合的非间距标记......但是有很多上下文你想要看到不可见的字符,特别是控制字符,所以很多字体都有符号,许多文本编辑器显示这些符号就好像它们是正常的间距字形一样。除了盒子中的0001之外,常用表示包括SOH(用于“标题开始”)或A(用于“控制-A”)或001(用于ASCII控制字符的八进制代码)在不同类型的框中。 This page和this显示了一些字体如何显示它。
**如果您足够了解,可以很容易地推断出,因为几乎任何字符集中的'\x01'
都会解码为u'\u0001'
。但知道如何直接查看字节比学习其他人的猜测更重要...