【发布时间】:2019-04-03 22:34:44
【问题描述】:
我正在处理来自 Hadoop 和 Hive 的输出文本文件,其中文件的字段由 control-A 分隔。然后我使用 Python 逐行读取文件,但字符串 split() 函数没有正确拆分,即使我指定了分隔符。
这里有一些我从 Hadoop 获得的典型数据示例。请注意,^A 实际上是一个控制字符。
field1^Afield2^Afield3^Afield4
field5^Afield6^Afield7^Afield8
您可以看到使用控制代码作为分隔符的Linux命令行工具cut确实有效。它正在输出第三个字段:
bash> cat test.txt | cut -d $'\001' -f 3
field3
field7
然后我编写了一个 Python 函数,它使用 standard Python idiom 逐行读取文件:
import re
def read_file(filename):
''' Read file line-by-line and split. '''
with open(filename, "r") as myfile:
for line in myfile:
tokens = line.split('\u0001')
#tokens = line.split('\^A')
#tokens = re.split('\^A', line)
print 'len(tokens): %d, tokens[0]: %s\n' % (len(tokens), tokens[0])
但是,当我运行该函数时,字符串未正确拆分。每行应该有四个标记。
>>> read_file('test2.txt')
len(tokens): 1, tokens[0]: field1field2field3field4
len(tokens): 1, tokens[0]: field5field6field7field8
正如您在我的 Python 函数中所见,我尝试了三种不同的方法来拆分字符串。他们都没有工作。
tokens = line.split('\u0001')
tokens = line.split('\^A')
tokens = re.split('\^A', line)
感谢您的帮助。
相关问题(没有一个适合我的解决方案):
【问题讨论】:
-
您是否尝试过只使用
line.split('^A')而没有转义?您的文件是否有任何机会以另一种格式编码?print(line)输出什么? -
请打印一个十六进制转储行,以便我们确切知道哪个字符是 control-A。
-
在这种情况下,不要使用
print进行调试,而是尝试使用print(repr(tokens))。这将显示你的字符串的实际值是什么 -
@Woody1193:当我执行
print(repr(line))时,它会打印:'field1\x01field2\x01field3\x01field4\n'。 -
@stackoverflowuser2010 在这种情况下,
\x01是您的分隔符
标签: python