使用re.split在Python中将文件分割成行

1 投票
4 回答
12167 浏览
提问于 2025-04-15 11:23

我正在尝试用列表推导式来分割一个文件,代码大概是这样的:

lines = [x for x in re.split(r"\n+", file.read()) if not re.match(r"com", x)]

但是,生成的行列表最后总是会有一个空字符串。有没有人知道怎么能避免这个问题(除了在后面加个 pop())?

4 个回答

1

另一个很实用的小技巧,特别是当你需要行号的时候,就是使用enumerate:


fp = open("myfile.txt", "r")
for n, line in enumerate(fp.readlines()):
    dosomethingwith(n, line)

我最近才知道enumerate这个东西,但从那以后它帮了我不少忙。

3

lines = file.readlines()

补充:如果你不想要空行,可以这样写:

lines = filter(lambda a:(a!='\n'), file.readlines())

补充2:如果你想去掉每行末尾的换行符,可以这样做:

lines = [re.sub('\n','',line) for line in filter(lambda a:(a!='\n'), file.readlines())]

9

把正则表达式放一边吧 :-)

  1. 你可以直接遍历文件;现在几乎不需要用 readlines() 了。
  2. 了解一下 str.strip()(还有它的好朋友 lstrip()rstrip())。
  3. 不要把 file 当作变量名。这是不好的做法,因为 file 是一个 内置函数

你可以这样写你的代码:

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 语句,这样可以让事情更简单一些。

撰写回答