【问题标题】:How do I read a formatted file in Python?如何在 Python 中读取格式化文件?
【发布时间】:2014-12-05 19:15:42
【问题描述】:

我需要从格式如下的文件中读取数据:

Jamestown                         20 Rocky Mountain                    34
Illinois St                       28 Ball St                           51
Tulsa                              7 Bowling Green                     34

我需要 Python 一次读取一行并获取两个团队名称(“Jamestown”和“Rocky Mountain”)和两个分数(“20”和“34”)。

我该怎么做呢?我尝试编写此代码以查看是否可以仅读取团队名称,但无论出于何种原因,它都不起作用。

oneSpace = False
for char in fileline:
    if char == ' ':
        if oneSpace:
            team1 = team1[:-1]
            return
        else:
            oneSpace = True
            team1 = team1 + char
    else:
        team1 = team1 + char
        oneSpace = False

【问题讨论】:

  • 你只需要分割行,str.split
  • @Kasra:在这里只使用line.split() 会做错事——例如,它会将Illinois 变成团队名称,将St 变成它的分数。他需要比这稍微聪明一点。
  • @abarnert 是的,当然!

标签: python file format character


【解决方案1】:
import re
ll=[]
for line in file.readlines():
     ll.append(re.findall(r"(.*?)\s{2,}(\d+)",line)
print ll

https://regex101.com/r/wV5tP1/12

【讨论】:

  • 这很好用,通过阅读一行,我得到以下输出: [[('Jamestown', '20'), ('Rocky Mountain', '34')]] 怎么做我对此进行格式化,以便我可以为 Jamestown 执行 ll[0],为 20 执行 ll[1],为落基山执行 ll[2],等等?
  • @ScottSinischo:你有一个列表列表,ll。所以,ll[0][0]'Jamestown'。或者,如果您不想要列表列表,请去掉 ll.append(…) 并直接使用 ll = … 并使用 ll[0] inside 循环。
【解决方案2】:

看起来您正在尝试编写的规则是在 2 个或更多空格的任何运行上进行拆分。有更简单的方法可以做到这一点。例如:

bits = [bit for bit in line.split('  ') if bit]
bits = re.split(r'\s\s+', line)

但是,我不确定这是否是该文件的正确规则。当您将事物置于固定位置时,您可能希望根据这些固定位置解析它们:

team1 = line[:34].rstrip()
score1 = line[34:37].rstrip()

……等等。

为什么?因为考虑一下当你得到这样的一行时会发生什么:

Team With a Really Long College Name28 Ball St                           51

输出可能会截断名称以确保至少有一个空格。它甚至可能会截断以确保至少有 两个 空格。但除非你知道他们会这样做,否则你的逻辑就会被打破。而通过实际的列位置可以保证做正确的事情。


还有一件事:您确定列只是由空格而不是制表符分隔吗?因为如果字符串 really 看起来像这样:

Tulsa\t 7\tBowling Green\t34

……那么你应该只使用line.split('\t')——或者,更好的是csv.reader(file, delimiter='\t', skipinitialspace=True)

【讨论】:

  • 加上完整的解释
【解决方案3】:

虽然您的代码过于复杂,但 只需进行少量更改即可使用——而且现实生活中的程序确实必须以这种方式编写,因为 unlike this case,没有更简单的解决方案。

那么,让我们回顾一下吧。


您的第一个问题是您在尝试修改之前从未将team1 分配给任何起始值。那是不可能的;只要您尝试访问不存在的值,您就会得到UnboundLocalError

但这也很容易解决:如果您希望 team1 以空字符串开头,您可以添加额外的字符,只需将其添加到函数的开头即可:

team1 = ''

您的第二个问题是,在计算team1 之后,您只是return 什么都没有,所以结果将始终是None。这也很容易解决:将return 语句更改为:

return team1

如果你解决了这两个问题,一切正常!你可以看到它在工作in this online interpreter session

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 2017-11-20
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2017-01-28
    • 2016-12-26
    • 2012-02-29
    • 2013-08-03
    相关资源
    最近更新 更多