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

2024-05-18 14:21:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

“两个队的名字都要读到”洛基和“两个队的名字”。在

我该怎么做呢?我试着编写这段代码,看看我是否能读懂团队名称,但不管是什么原因,它都不起作用。在

^{pr2}$

Tags: 文件代码格式green读取数据团队名字st
3条回答

虽然您的代码过于复杂,但它可以只做一些修改就可以工作,而且有一些实际的程序必须这样编写,因为unlike this case没有更简单的解决方案。在

所以,让我们回顾一下。在


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

但这也很容易修复:如果您希望team1作为一个空字符串开始,您可以在上面添加额外的字符,只需将以下内容添加到函数的开头:

team1 = ''

你的第二个问题是,在你做了所有的工作来计算team1之后,你只是return什么都没有,所以结果总是None。这也很容易修复:将return语句更改为:

^{pr2}$

如果你能解决这两个问题,一切都会成功!你可以看到它正在工作in this online interpreter session。在

看起来你要写的规则是在两个或两个以上的空格上分开。有更简单的方法。例如:

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

但是,首先我不确定这是否是该文件的正确规则。当你把东西放在固定位置时,你可能想根据这些固定位置来解析它们:

^{pr2}$

……等等

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

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)。在

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

相关问题 更多 >

    热门问题