4

我有一个包含多行的文本文件。一行的示例是: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])

但是当我将空分隔符物理转换为逗号分隔符时,我可以使用正确的值读取它。

4

1 回答 1

4

我知道 \u0001 不是正确的分隔符。这只是一个假设的例子。我无法在此处粘贴分隔符,它看起来像一个带有 0001 的封闭方形框,采用 2 行 x 2 列的方式。

最有可能的是,在某种意义上\u0001 正确的分隔符,你只是做错了。

有些字体使用类似符号来显示非打印控制字符,因此 0001-in-a-box 是 U+0001 的表示,也就是标题的开始,也就是 control-A。*

第一个问题是 Python 2.x 文字'\u0001'没有指定该字符。您不能在文字中使用\u转义str符,只能在文字中使用unicode文档对此进行了解释,但是如果您考虑一下,这很有意义。因此,文字'\u0001'不是源文件编码中的字符 U+0001,它是六个单独的字符(一个反斜杠、一个字母和四个数字)。

那么,你能用u'\u0001'吗?嗯,是的,但是您需要将文本文件解码为 Unicode,这在这里可能不合适。它根本不是一个文本文件,它是一个二进制文件。关键是这样看。

您的文本编辑器无法做到这一点,因为它是……好吧,一个文本编辑器,因此它会将您的二进制文件解码为 ASCII(或者可能是 UTF-8、Latin-1、cp1252 等)文本,然后显示结果Unicode,这就是为什么您会看到 U+0001 的字体表示。但是 Python 可以让你直接处理二进制数据;这就是 a 的str作用。

那么,文件中的实际字节数是多少?如果你这样做:

b = f.readline()
print repr(b)

你可能会看到这样的东西:

'357812\x0110\x0113\x017\x018\n'

这就是关键:您想要的实际分隔符是'\x01'.**


当然你可以使用u'\u0001'.encode('Latin-1'), 或者你的源文件的任何编码......但这只是愚蠢的。您知道要匹配哪个字节,为什么要尝试提出一个表示该字节的表达式而不是仅仅指定它?


如果您愿意,您也可以将 control-A 分隔符转换为更传统的东西,例如逗号:

lines = (line.replace('\x01', ',') for line in file)

但是没有理由要付出额外的努力来解决这个问题。特别是如果某些列可能包含文本,其中可能包含逗号......那么你必须做一些事情,比如在每个不在引号内的原始逗号前面加上一个反斜杠,或者引用每个字符串列,或者其他什么,然后才能替换用逗号分隔。


* 从技术上讲,它应该显示为非组合非间距标记......但是在许多上下文中您希望看到不可见字符,尤其是控制字符,因此许多字体都有符号,并且许多文本编辑器将这些符号显示为如果它们是正常的间距字形。除了框中的 0001 之外,常见的表示形式还包括不同类型框中的 SOH(表示“标题开头”)或 A(表示“控制 A”)或 001(ASCII 控制字符的八进制代码)。此页面页面显示了一些字体如何显示它。

** 如果您知道得足够多,您可以很容易地推断出这一点,因为'\x01'在几乎任何字符集中都会解码为u'\u0001'. 但知道如何直接看字节比了解别人的猜测更重要……</p>

于 2013-08-20T18:07:15.093 回答