繁体   English   中英

从文本文件读取

[英]Reading from a text file

我不是在这里寻找答案,而是在寻找应该如何完成此任务的指南。

我有一个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

因为数字与每年相关,所以我想将每一行放入一个元组,然后将所有元组合并到一个列表中。 在此列表中,使用正则表达式搜索列表以获取匹配的元组并相应地将其打印出来。

这是可以接受的方式吗? 是否有一个更简单,更明显的解决方案? 不是真正地寻找最佳方法,而是关于如何解决这个问题的不同想法。

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循环主体中的每一行,然后决定是否接受它。 如果想花哨的话,请查看mapfilter with语句可确保此后关闭文件。

您可以做的一件事是使用生成器使用与已经完成的类似的方法动态地过滤出列表的成员:

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

您的关键字是否总是年份? 如果是这样,我会将它们存储在这样的字典中:

mydata[year][quarter] = value

因此,您可以通过mydata ['1947']来获取示例数据。

要读取文件,您可能要使用csv.reader,然后在'q'上拆分第一列以分别获取年份和季度。

我会编写代码,使函数中的所有行都返回一个元组序列,如(1947,3,-7.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,是因为每个行字符串都以换行符结尾。

据我所知,正则表达式就是为这种工作而发明的。

正则表达式将直接搜索“包含关键字的行”。 与使用笨拙的“ for f in line”循环相比,regex的搜索还可以基于更复杂的条件,这些条件将以更简洁的代码表示。

我的座右铭是:文本文件中没有行。 这只是一个字符序列。

“ for 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之后需要'。*'。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM