在Python中读取文本文件时如何使用正则表达式?

在Python中读取文本文件时如何使用正则表达式?,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我想给你举个例子。如果我试图从文件中打印包含整数-9999的行 19940325 78 -28 -9999 19940326 50 17 102 19940327 100 -11 -9999 19940328 56 -33 0 19940329 61 -39 -9999 19940330 61 -56 0 19940331

我想给你举个例子。如果我试图从文件中打印包含整数
-9999
的行

19940325       78     -28   -9999
19940326       50      17     102
19940327      100     -11   -9999
19940328       56     -33       0
19940329       61     -39   -9999
19940330       61     -56       0
19940331      139     -61   -9999
19940401      211       6       0
下面是我的代码,它使用regex读取文本文件并扫描以查找整数
-9999
,然后只打印包含该整数的行

import re

file= open("USC00110072.txt", "r")


for line in file.readlines():
    if re.search('^-9999$', line, re.I):
        print line

我的代码运行时出错,但在输出中没有显示任何内容。请让我知道我犯了什么错误

Regex很可能是杀伤力过大,使用操作符中的
进行简单的子字符串检查似乎就足够了

with open("USC00110072.txt") as f:
    for line in f:
        if '-9999' in line:
            print(line)
或者,如果你关心的是作为一个“整体词”的匹配,你可以做更多的事情来划分这些值

with open("USC00110072.txt") as f:
    for line in f:
        if '-9999' in line.strip().split('\t'):
            print(line)

对于这一点来说,正则表达式可能有些过分,使用
操作符中的
进行简单的子字符串检查似乎就足够了

with open("USC00110072.txt") as f:
    for line in f:
        if '-9999' in line:
            print(line)
或者,如果你关心的是作为一个“整体词”的匹配,你可以做更多的事情来划分这些值

with open("USC00110072.txt") as f:
    for line in f:
        if '-9999' in line.strip().split('\t'):
            print(line)

您可以使用
过滤器

with open(fn) as f:
    print filter(lambda line: '-9999' in line.split()[-1], f)
这将检查'-9999'是否在行的最后一列中

如果要使用正则表达式:

with open(fn) as f:
    for line in f:
        if re.search(r'-9999$', line): # remove $ if the -9999 can be anywhere in the line
            print line.strip()
除了只包含
-9999
的行之外,您拥有的
^
永远不会匹配。
^
表示行的开始

或者,只需使用
in
测试字符串的存在:

with open(fn) as f:
    for line in f:
        if '-9999' in line:
            print line.strip()

您可以使用
过滤器

with open(fn) as f:
    print filter(lambda line: '-9999' in line.split()[-1], f)
这将检查'-9999'是否在行的最后一列中

如果要使用正则表达式:

with open(fn) as f:
    for line in f:
        if re.search(r'-9999$', line): # remove $ if the -9999 can be anywhere in the line
            print line.strip()
除了只包含
-9999
的行之外,您拥有的
^
永远不会匹配。
^
表示行的开始

或者,只需在
中使用
,即可测试字符串的存在性:

with open(fn) as f:
    for line in f:
        if '-9999' in line:
            print line.strip()

或者,由于您有一个
csv
文件,您可以使用
csv
模块:

import csv
import io

file = io.StringIO(u'''
19940325\t78\t-28\t-9999
19940326\t50\t17\t102
19940327\t100\t-11\t-9999
19940328\t56\t-33\t0
19940329\t61\t-39\t-9999
19940330\t61\t-56\t0
19940331\t139\t-61\t-9999
19940401\t211\t6\t0
'''.strip())

reader = csv.reader(file, delimiter='\t')
for row in reader:
    if row[-1] == '-9999':   # or, for regex, `re.match(r'^-9999$', row[-1])`
        print('\t'.join(row))

或者,由于您有一个
csv
文件,您可以使用
csv
模块:

import csv
import io

file = io.StringIO(u'''
19940325\t78\t-28\t-9999
19940326\t50\t17\t102
19940327\t100\t-11\t-9999
19940328\t56\t-33\t0
19940329\t61\t-39\t-9999
19940330\t61\t-56\t0
19940331\t139\t-61\t-9999
19940401\t211\t6\t0
'''.strip())

reader = csv.reader(file, delimiter='\t')
for row in reader:
    if row[-1] == '-9999':   # or, for regex, `re.match(r'^-9999$', row[-1])`
        print('\t'.join(row))

您可以直接在文件上迭代(即,
用于文件中的行
)-
读取行
将首先将整个文件读取到内存中。当您的文件为50GB时,这是不好的。您可以直接在文件上迭代(即,
对于文件中的行
)-
读取行
将首先将整个文件读取到内存中。如果你的文件是50GB,那就不好了。假设单个字段都很重要,那么对选项卡分隔的数据使用
csv
是个好主意。我也会用它来输出,以防万一;您只需将
sys.stdout
包装在
csv.writer
中进行匹配即可。假设各个字段都很重要,那么将
csv
用于制表符分隔的数据是一个好主意。我也会用它来输出,以防万一;您可以将
sys.stdout
包装在
csv.writer
中进行匹配。如果只需要打印第三列上值为-9999的行怎么办?如果只需要打印第三列上值为-9999的行怎么办?