代码之家  ›  专栏  ›  技术社区  ›  stackoverflowuser2010

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

  •  1
  • stackoverflowuser2010  · 技术社区  · 7 年前

    我正在处理来自Hadoop和Hive的输出文本文件,其中文件的字段由control-A分隔。然后我使用Python逐行读取文件,但是字符串 split() 即使我指定了分隔符,函数也没有正确拆分。

    ^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
    

    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 回复  |  直到 7 年前
        1
  •  2
  •   user803422    7 年前

    假设控件A是字符“\x01”(ASCII代码1):

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

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