【问题标题】:Python read text file and split on control characterPython读取文本文件并在控制字符上拆分
【发布时间】: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)

感谢您的帮助。

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

delimiting carat A in python

re.split not working on ^A

【问题讨论】:

  • 您是否尝试过只使用line.split('^A') 而没有转义?您的文件是否有任何机会以另一种格式编码? print(line) 输出什么?
  • 请打印一个十六进制转储行,以便我们确切知道哪个字符是 control-A。
  • 在这种情况下,不要使用print 进行调试,而是尝试使用print(repr(tokens))。这将显示你的字符串的实际值是什么
  • @Woody1193:当我执行print(repr(line)) 时,它会打印:'field1\x01field2\x01field3\x01field4\n'
  • @stackoverflowuser2010 在这种情况下,\x01 是您的分隔符

标签: python


【解决方案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']

【讨论】:

  • 谢谢!此行有效:tokens = line.split('\x01')。但我想知道为什么tokens = line.split('\u0001') 不起作用?
  • 再次感谢。 tokens = line.split(u'\u0001') 也会产生正确的答案。
猜你喜欢
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多