我正在尝试使用类似于:
的代码拆分包含列表解析的文件lines = [x for x in re.split(r"\n+", file.read()) if not re.match(r"com", x)]
但是,行列表总是有一个空字符串作为最后一个元素。有没有人知道避免这种情况的方法(不包括之后放一个pop()的淤泥)?
答案 0 :(得分:9)
将正则表达式锤放走: - )
readlines()
这几天几乎已经过时了。str.strip()
(及其朋友,lstrip()
和rstrip()
)。file
用作变量名称。这是不好的形式,因为file
是built-in function。您可以将代码编写为:
lines = []
f = open(filename)
for line in f:
if not line.startswith('com'):
lines.append(line.strip())
如果你仍然有空行,你可以添加一个测试:
lines = []
f = open(filename)
for line in f:
if line.strip() and not line.startswith('com'):
lines.append(line.strip())
如果你真的想要它在一行:
lines = [line.strip() for line in open(filename) if line.strip() and not line.startswith('com')]
最后,如果您使用的是python 2.6,请查看with statement以进一步改进。
答案 1 :(得分:3)
lines = file.readlines()
修改强> 或者如果你不想在那里留空行,你可以
lines = filter(lambda a:(a!='\ n'),file.readlines())
修改^ 2:强> 删除尾随newines,你可以做
lines = [re.sub('\ n','',line)for filter中的行(lambda a:(a!='\ n'),file.readlines())]
答案 2 :(得分:1)
另一个方便的技巧,特别是当你需要行号时,是使用枚举:
fp = open("myfile.txt", "r")
for n, line in enumerate(fp.readlines()):
dosomethingwith(n, line)
我最近才发现有关枚举的事情,但从那以后它已经派上用场了好几次。
答案 3 :(得分:0)
这应该有效,并且也消除了正则表达式:
all_lines = (line.rstrip()
for line in open(filename)
if "com" not in line)
# filter out the empty lines
lines = filter(lambda x : x, all_lines)
由于您使用的是列表推导而不是生成器表达式(因此无论如何整个文件都会加载到内存中),这是一个避免代码过滤掉空行的快捷方式:
lines = [line
for line in open(filename).read().splitlines()
if "com" not in line]