我需要读取格式如下的文件中的数据:
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
答案 0 :(得分:2)
import re
ll=[]
for line in file.readlines():
ll.append(re.findall(r"(.*?)\s{2,}(\d+)",line)
print ll
答案 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。