如何在Python中读取格式化文件?

时间:2014-12-05 19:15:42

标签: python file format character

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

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

我需要Python一次读取一行并获得两个团队名称(" Jamestown"和#34; 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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

看起来你尝试编写的规则是在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

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


还有一件事:你确定列只是用空格分隔,而不是标签?因为如果字符串真的是这样的:

Tulsa\t 7\tBowling Green\t34

...那么您应该只使用line.split('\t') - 或者更好,csv.reader(file, delimiter='\t', skipinitialspace=True)

答案 2 :(得分:-1)

虽然你的代码过于复杂,但可以只能进行一些更改 - 而现实生活中的程序必须以这种方式编写,因为{{3} },没有更简单的解决方案。

所以,让我们回顾一下。


您的第一个问题是,在尝试修改之前,您永远不会将team1指定给任何起始值。那不可能奏效;只要您尝试访问不存在的值,您就会获得UnboundLocalError

但这也很容易解决:如果你想让team1作为空字符串开始,你可以将多余的字符添加到上面,只需将其添加到函数的开头:

team1 = ''

您的第二个问题是,在完成计算team1的所有工作后,您只需return,因此结果将始终为None。这也很容易修复:将return语句更改为:

return team1

如果你解决了这两个问题,一切正常!你可以看到它正常工作unlike this case