【发布时间】:2011-07-21 17:55:56
【问题描述】:
我正在寻找一种可以从 python 文件中删除所有空行的衬垫。
python 等价于 --> grep -v '^$' file_name > file_name
【问题讨论】:
-
Python 通常不适合单行代码,但应该可以编写一个简短的程序。
-
为什么需要单线?
标签: python
我正在寻找一种可以从 python 文件中删除所有空行的衬垫。
python 等价于 --> grep -v '^$' file_name > file_name
【问题讨论】:
标签: python
lines = [i for i in open(file_path) if i[:-1]]
如果需要写入另一个文件,您可以使用file_object.writelines(lines)打开文件进行写入。
【讨论】:
with 如何更安全?
with 更改为内联 open() 更容易出错。为什么单排会改变一些事情?
with 在文件上下文中的全部意义在于确保文件被关闭。由于所有文件都会在终止时关闭,因此with 在这里没有任何区别。
bool(line.rsplit()) 不等于否定 ^$ 匹配。 bool(line[:-1]) 是。
以下内容不是单行的,但可以完成工作并且易于阅读:
for line in open(filename):
line = line.rstrip()
if line != '':
print line
这会将结果打印到标准输出。修改此代码以在其他地方打印是微不足道的。
如果您坚持,将其转换为单线是相当容易的:
''.join(l for l in open(filename) if l.rstrip())
【讨论】:
<>。
!= 也是不必要的,因为空字符串的计算结果为 false,如果您正在执行多线程,为什么不使用 with?
一个无环的:
open('dst','w').write(re.sub('\n\s*\n+','\n', open('src').read()))
【讨论】:
filter(bool, map(lambda x:x.rstrip(), open(filename)))
【讨论】:
str.rstrip 作为键,而不是创建 lambda 函数。
如果您需要真正的单线:
python -c 'import sys; print "".join(l for l in sys.stdin.readlines() if l.strip()),'
可以在你的shell中用作:
cat input.txt | python -c 'import sys; print "".join(l for l in sys.stdin.readlines() if l.strip()),' > output.txt
【讨论】:
如果你想处理大文件而不用担心内存不足的错误,你应该循环执行:
import sys
for line in sys.stdin:
if line[:-1]:
sys.stdout.write(line)
如果必须有一行代码,下面是一行相同的代码:
for _ in (sys.stdout.write(line) for line in sys.stdin if line[:-1]): pass
已编辑以包含 agf 的提示。
【讨论】:
for Null in (sys.stdout.write(line) for line in sys.stdin if line.strip()): pass,你就没有保存Nones(除了一个,反正)
line.strip() 将跳过仅包含空格的非空行。
os.system("grep -v '^$' file_name > file_name")
【讨论】:
grep -v '^$' file_name > file_name 他不想执行 grep 否则他只会使用 cmd 行,os.system 是执行 shell 命令及其的最糟糕的方式不跨平台
fileinput 模块具有“就地”选项,用于一次性编辑文件。在读取文件时,标准输出会暂时重定向到输入文件。
这是一个可以做你想做的事情(在 bash 中完成):
python -c $'import sys, re, fileinput\nfor line in fileinput.input("file_name", inplace=True): sys.stdout.write( re.sub(r"^\\n$", "", line) )'
【讨论】: