分隔符[0001]在文本文件中,在python中使用np.loadtxt读取

时间:2013-08-20 01:43:12

标签: python arrays file-io input numpy

我有一个包含多行的文本文件。 一行的示例是: 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分隔符物理转换为逗号分隔符时,我可以用正确的值读取它。

1 个答案:

答案 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 pagethis显示了一些字体如何显示它。

**如果您足够了解,可以很容易地推断出,因为几乎任何字符集中的'\x01'都会解码为u'\u0001'。但知道如何直接查看字节比学习其他人的猜测更重要...