使用re.split在Python中将文件拆分为行
我正在尝试使用类似以下代码拆分具有列表的文件:使用re.split在Python中将文件拆分为行,python,regex,list-comprehension,Python,Regex,List Comprehension,我正在尝试使用类似以下代码拆分具有列表的文件: lines = [x for x in re.split(r"\n+", file.read()) if not re.match(r"com", x)] 但是,“行”列表的最后一个元素始终为空字符串。有人知道避免这种情况的方法吗(不包括在后面放一个pop()的麻烦)?lines=file.readlines() 编辑: 或者,如果你不想在那里有空白行,你可以这样做 lines=filter(lambda:(a!='\n'),file.readl
lines = [x for x in re.split(r"\n+", file.read()) if not re.match(r"com", x)]
但是,“行”列表的最后一个元素始终为空字符串。有人知道避免这种情况的方法吗(不包括在后面放一个pop()的麻烦)?lines=file.readlines()
编辑:
或者,如果你不想在那里有空白行,你可以这样做
lines=filter(lambda:(a!='\n'),file.readlines()
编辑^2:
要删除尾随的newine,可以执行以下操作
lines=[re.sub('\n','',line),用于过滤器中的行(lambda:(a!='\n'),file.readlines())]lines=file.readlines()
编辑:
或者,如果你不想在那里有空白行,你可以这样做
lines=filter(lambda:(a!='\n'),file.readlines()
编辑^2:
要删除尾随的newine,可以执行以下操作
lines=[re.sub('\n','',line)用于过滤器中的行(lambda:(a!='\n'),file.readlines())]将正则表达式锤收起来:-)
readlines()
现在几乎过时了lstrip()
和rstrip()
)文件
用作变量名。这是一种糟糕的形式,因为文件是一种格式
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')]
最后,如果您使用的是Python2.6,请查看以进一步改进
readlines()
现在几乎过时了lstrip()
和rstrip()
)文件
用作变量名。这是一种糟糕的形式,因为文件是一种格式
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')]
最后,如果您使用的是Python2.6,请查看以进一步改进。这应该会起作用,并消除正则表达式:
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]
这应该是可行的,并且消除了正则表达式:
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]
另一个方便的技巧,尤其是当您需要行号时,是使用enumerate:
fp=打开(“myfile.txt”、“r”)
对于n,枚举中的行(fp.readlines()):
dosomethingwith(n,线)
我最近才发现enumerate,但从那以后它已经派上了很多用场。另一个方便的技巧,尤其是当您需要行号时,是使用enumerate:
fp=打开(“myfile.txt”、“r”)
对于n,枚举中的行(fp.readlines()):
dosomethingwith(n,线)
我最近才发现enumerate,但从那以后它已经派上了好几次用场。保留后面的换行符。我不确定这是否是OP.file的一个问题。readlines()不完全相同。。。它包括每行末尾的换行符,并包括空行。保留尾随的换行符。我不确定这是否是OP.file的一个问题。readlines()不完全相同。。。它包括每行末尾的换行符,还包括空行。自去年以来,我就没有写过任何Python,我正在从一次简短但糟糕的PERL测试中恢复过来。多亏了你的回答,我又回到了思维定势:)我从去年开始就没有写过任何Python,我正在从一次短暂但糟糕的PERL测试中恢复过来。多亏了你的回答,我又回到了思维模式:)你可以只写“过滤器(无,所有行)”而不是“过滤器(lambda x:x,所有行)”。虽然我从来没有对这条捷径感到完全满意:-)而不是“filter(lambda x:x,all_line)”,你可以只写“filter(None,all_line)”。尽管我从来没有对这条捷径感到完全满意:-)