在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的行怎么办?