我不是在寻找答案,而是我应该如何处理这项任务的指导原则。
我有一个包含以下信息的txt文件:
...
1947q2 -0.6
1947q3 -0.3
1947q4 6.2
1948q1 6.5
1948q2 7.6
1948q3 2.2
1948q4 0.6
...
我的目标是能够根据关键字选择阅读文本文件。例如,我想读取仅包含1947的行,因此输出将如下:
1947q2 -0.6
1947q3 -0.3
1947q4 6.2
因为这些数字与每年相关,所以我考虑将每一行放在一个元组中,然后将所有元组组合成一个列表。从此列表中,使用正则表达式搜索列表以获取匹配的元组并相应地打印出来。
这是一种可以接受的方式吗?有没有更简单明了的解决方案呢?不是真正寻找最佳方法,而是寻找如何处理这个问题的不同想法。
答案 0 :(得分:5)
import sys
with open('file.txt') as f:
for line in f:
if '1947' in line: # or some complex regular expressions test
sys.stdout.write(line)
您可以解析for
循环体内的每一行,然后决定是否接受它。如果您想获得幻想,请查看map和filter。 with
语句确保文件在之后关闭。
答案 1 :(得分:1)
您可以做的一件事是use generators使用与您已经完成的方法类似的方法动态过滤掉列表成员:
data = open("file.txt")
fortysevens = (line for line in data if contains_47(line))
for line in fortysevens:
# do something here
def contains_47(line):
# your existing code here to detect if a line contains 47
答案 2 :(得分:0)
您的关键字是否会成为年份?如果是这样,我会将它们存储在这样的字典中:
mydata[year][quarter] = value
所以你可以通过mydata ['1947']获取你的例子数据。
要阅读该文件,您可能需要使用csv.reader,然后将第一列拆分为“q”以分别获得年份和季度。
答案 3 :(得分:0)
我编写的代码占用了函数中的所有行,返回了一系列元组,如(1947,3,-7.0)。然后对结果进行简单的迭代,找出我真正想要的那些。
答案 4 :(得分:0)
如果输入文件行中的数据是固定的 - 就像它们看起来那样 - 那么这样简单的东西就可以了:
with open('data.txt') as data:
for line in data:
if line[4:8] == '1947':
print line,
# output:
# 1947q2 -0.6
# 1947q3 -0.3
# 1947q4 6.2
请注意,我使用print line,
的原因是因为每个换行符都以换行符结尾。
答案 5 :(得分:0)
据我所知,正是为这种工作发明了正则表达式。
正则表达式将直接搜索“包含关键字的行”。正则表达式的搜索也可以基于更复杂的条件,这些条件将用更简洁的代码表示,而不是使用笨拙的“for line in f”循环。
我的座右铭是:文本文件中没有“行”。它只是一系列字符。
for line in f“循环的作用是分析数据流以检测换行并停止它们:这是第一次检测。然后在找到的每一行上,必须在检测到的每一行上测试一个(或多个)简单(或复杂)条件:这是第二项研究。
另一方面,正则表达式直接找到搜索的内容,而无需初步搜索换行符。线条的条件和线中关键字的条件同时进行测试。
import re
keyw = '1947'
pat = re.compile('.*?' + keyw + '.*')
with open('thefile.txt','r') as f:
keyworded_lines = pat.findall(f.read())
# do what you need with keyworded_lines
请注意,在'r'模式下,Python会转换'\ n'中的所有换行符。由于RE中的点与'\ n'不匹配,因此RE在keyw之后仅需要'。*'。