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

文本文件中的分隔符[0001],在python中使用np.loadtxt读取,python,arrays,file-io,input,numpy,Python,Arrays,File Io,Input,Numpy,我有一个有几行的文本文件。 行的一个示例是: 3578312103778 但是,分隔符是[0001](在框中)而不是逗号或制表符等传统分隔符 我用python中的numpy来阅读这篇文章,有人知道分隔符应该是什么吗? 我查了文件,但什么也没找到 import numpy as np read_data= np.genfromtxt(fname, delimiter='\u0001') 给出: array([ nan, nan, nan, ..., nan, nan, nan]) 但

我有一个有几行的文本文件。 行的一个示例是: 3578312103778

但是,分隔符是[0001](在框中)而不是逗号或制表符等传统分隔符

我用python中的numpy来阅读这篇文章,有人知道分隔符应该是什么吗? 我查了文件,但什么也没找到

import numpy as np
read_data= np.genfromtxt(fname, delimiter='\u0001')
给出:

array([ nan,  nan,  nan, ...,  nan,  nan,  nan])
但是,当我实际地将空分隔符转换为逗号分隔符时,我可以使用正确的值来读取它

我知道\u0001不是正确的分隔符。这只是一个假设的例子。我无法在这里粘贴分隔符,它看起来像一个封闭的方形框,以2行2列的方式显示0001

从某种意义上说,
\u0001
很可能是正确的分隔符,您只是做错了

有些字体使用类似于用于显示非打印控制字符的符号,因此0001-in-a-box是U+0001(又名标题开头,又名控制-a)的表示形式*

第一个问题是Python 2.x literal
“\u0001”
没有指定该字符。不能在
str
文本中使用
\u
转义,只能在
unicode
文本中使用。解释一下,但如果你仔细想想,这是有道理的。因此,文本
'\u0001'
不是源文件编码中的字符U+0001,而是六个独立的字符(一个反斜杠、一个字母和四个数字)

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

您的文本编辑器无法做到这一点,因为它是一个文本编辑器,所以它将二进制文件解码为ASCII(或者UTF-8、拉丁语-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控制字符的八进制代码)。并显示一些字体如何显示它


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

首先,如果您使用的是Python 2.x,普通字符串不会处理
\u
转义,因此只有6个常规字符;你可能想要
u'\u0001'
'\x01'
。其次,你认为
\u0001
是正确的,你想匹配你所说的“[0001](在一个框中)”吗?然后你称之为“空分隔符”,这更让人困惑。你到底想匹配什么?NUL,ctrl-A,一些奇怪的字符序列…?在不知道文件中实际包含的字节数的情况下,没有人能告诉你如何读取它。你能发布一段你试图解析的文本片段和预期的输出吗?到目前为止,您所拥有的内容确实令人困惑。@abarnert:文本文件是从我无权访问的配置单元查询生成的。我知道\u0001不是正确的分隔符。这只是一个假设的例子。我无法在此处粘贴分隔符,它看起来像一个封闭的方形框,以2行2列的方式显示0001。@Vedant为我们提供
打印(repr(open('your_file','rb')。read(100))
感谢@abarnert提供了所有知识并解决了我的问题。