Python读取文本文件并按控制字符分割

时间:2018-10-30 19:47:05

标签: python

我正在使用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)

感谢您的帮助。

相关问题(没有一个对我有用的解决方案):

delimiting carat A in python

re.split not working on ^A

1 个答案:

答案 0 :(得分:1)

假定control-A是字符“ \ x01”(ASCII代码1):

>>> line="field1\x01field2\x01field3\x01field4"
>>> line.split("\x01")
['field1', 'field2', 'field3', 'field4']

如果要使用“ \ u0001”表示法,则需要使用“ u”前缀(Python 2):

>>> line.split(u"\u0001")
[u'field1', u'field2', u'field3', u'field4']