【问题标题】:Python library for parsing space delimited files [duplicate]用于解析空格分隔文件的 Python 库 [重复]
【发布时间】:2012-12-08 00:55:43
【问题描述】:

可能重复:
Efficient way of parsing fixed width files in Python

甚至不确定“空格分隔”是否真的是正确的术语(这可能是阻碍我搜索工作的原因)。基本上,字段 X 从字符 0 开始,字段 Y 从字符 30 开始。很确定这是我们的一个系统仍在使用的古老文件格式。我可以轻松推出自己的解决方案,但如果存在,我宁愿使用现有的库。

【问题讨论】:

  • 你是对的,“空格分隔”可能不是最好的术语,因为它也可能意味着使用空格而不是逗号的 CSV 方言......但你的解释非常清楚你实际上是什么想要,所以我不会太担心。

标签: python


【解决方案1】:

这个问题看起来和你的很相似。看起来他们对哪些模块最有用提出了一些建议:

How to efficiently parse fixed width files?

【讨论】:

    【解决方案2】:
    with open('myfile.txt') as f:
      for line in f.readlines():
        x, y = line[:28], line[29:]
    

    应该将x, y 参数与每一行分开。

    【讨论】:

    • 这确实是固定宽度文件的最佳方法,只需在适当的位置拆分字符串即可。
    • 这里的line.split() 会破坏一切。例如,使用'1234567890123456789012345 abcdef',它将设置line = [''1234567890123456789012345', 'abcdef'],然后line[:28] 将引发索引错误。如果你把split 去掉,那么这就是正确的答案。
    • @abarnert - 谢谢,我以不同的方式阅读了这个问题,这意味着有 n 个值,空格分隔,前 30 个是 x,其余的是 y。
    • +1 现在已修复。但是最后几个 cmets:许多固定宽度格式允许使用整个列而根本没有空间,所以 12345678901234567890123456abcdef 字段是 12345678901234567890123456abcdef。在 OP 的情况下,这听起来并不正确,但总的来说,您可能想要line[:29], line[29:] 而不是line[:28], line[29:]。此外,您可能希望line[:29].rstrip() 摆脱多余的空间。最后,为什么你在第 29 列而不是 OP 的 30 开始字段 Y
    【解决方案3】:

    子类csv.Dialect如下:

    import csv
    
    class SpaceCsv(csv.Dialect):
        "csv format for exporting tables"
        delimiter = None
        doublequote = True
        escapechar = None
        lineterminator = '\n'
        quotechar = '"'
        skipinitialspace = True
        quoting = csv.QUOTE_MINIMAL
    csv.register_dialect('space', SpaceCsv)
    

    然后将其用作csv.reader(filename, dialect="space")。让我知道你过得怎么样...

    【讨论】:

    • 这将引发TypeError: delimiter must be set。而且,即使它有效,它也不会在固定宽度的列上拆分,这是 OP 所要求的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多