【问题标题】:Parsing text file with a complicated delimiter使用复杂的分隔符解析文本文件
【发布时间】:2019-07-01 01:15:40
【问题描述】:

我有一个包含以下格式的推文的文本文件

['RT @abcd: Name another swing group who can sell out Bob Field. Thank you.', 'Thanks to amazing supporters like @Bob Community Development, eligible New Yorkers can use NYC #FreeTaxPrep to get… SomeURL']

我想将字符串转换为单个推文的列表。

在我看来,分隔符是一个单引号,后跟一个逗号,后跟一个空格,然后是一个单引号。

我的代码如下:

opened_file = open('file_name.txt')
read_file = opened_file.read()
split_dataset = read_file.split(" \', \' ")

但是,当我测试结果列表的长度时,我得到的只是一个大小,这意味着没有进行任何解析。

>>> len(split_dataset)
1

【问题讨论】:

  • 如果您对字符串使用双引号,我认为您不需要转义单引号。

标签: python python-3.x csv text io


【解决方案1】:

文本文件是用“字符串化”的 Python 列表语法编写的。 ast.literal_eval 可以将其转换回真正的 Python 列表:

>>> s = '''['RT @abcd: Name another swing group who can sell out Bob Field. Thank you.', 'Thanks to amazing supporters like @Bob Community Development, eligible New Yorkers can use NYC #FreeTaxPrep to get… SomeURL']'''
>>> import ast
>>> ast.literal_eval(s)
['RT @abcd: Name another swing group who can sell out Bob Field. Thank you.', 'Thanks to amazing supporters like @Bob Community Development, eligible New Yorkers can use NYC #FreeTaxPrep to get… SomeURL']

这将读取并转换每一行:

import ast
with open('file_name.txt') as f:
    for line in f:
        L = ast.literal_eval(line)
        # do something with the list

【讨论】:

    【解决方案2】:

    您应该使用以下字符串进行拆分:read_file.split("', '")(没有前导或尾随空格,没有反斜杠)。

    这不会处理前导和尾随字符('[])。虽然您可以手动处理它们,但看起来列表是使用 python 模块或函数写入文件的。您可以使用相同的模块直接读取列表。例如,对 1 行文件使用 yaml,但也适用于多行文件:

    import yaml
    
    with  open('file_name.txt') as opened_file:
        for line in opened_file.readlines():
            split_dataset = yaml.load(line)
            print len(split_dataset)
    

    【讨论】:

      【解决方案3】:

      您的数据几乎存储在 JSON 中,除了使用单引号而不是双引号。也许最好将数据“修复”为看起来像真正的 JSON,然后使用 json 模块处理它:

      import json
      read_file = read_file.replace('"', '\\"').replace("'", '"')
      split_dataset = json.loads(read_file)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多