我知道 \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>