Python fileinput 使用总结
用途
1. 多个文件作为输入, 遍历文件每一行
2. 在原处修改文件
用途1
如果我们有如下的文件夹结构:
test/
|_____ 1.txt content:
| 1_line1
| 1_line2
|_____ 2.txt content:
| 2_line1
| 2_line2
|_____ test_fileinput.py
import fileinput
import sys
for line in fileinput.input(sys.argv[1:]):
print(fileinput.filename(), fileinput.filelineno(), line)
在 Linux 下执行
$ python test_fileinput.py *.txt
输出
1_line1
1_line2
2_line1
2_line2
在Windows下直接用*.txt, 系统不认
所以修改成
import glob
all_files = [f for files in sys.argv[1:] for f in glob(files)]
for line in fileinput.input(all_files):
print(fileinput.filename(), fileinput.filelineno(), line)
这样兼容Linux/Windows, 两种形式 *.txt
和 1.txt 2.txt
都可以作为输入。
总之最后提供一个 filelist 给 input 就行。也可以这样:
$ ls | ./filein.py
甚至并不一定是多个文件, 也可以是多个文件的内容, 例如
$ cat *.py | python fileinput_grep.py fileinput
也能正常工作, 会遍历"所有.py文件的每一行"。以上的用法对单个文件/文件内容也同样适用。
用途2: 在原处(inplace)修改文件
for line in fileinput.input('file.txt', inplace=True):
line = ... # edit line
print line, # stdout is redirected to the file
Note:
fileinput 能够提供很多元数据信息, 例如上面看到的
fileinput.filename()
,fileinput.filelineno()
,还有fileinput.isfirstline()
,fileinput.isstdin()
等, 更多内容参考官方文档fileinput 支持 context manager 例如在原处修改文件最好写成
with fileinput.input('file.txt', inplace=True) as f: for line in f: ...
否则最后还得调用 fileinput.close()
一个常见的任务是,如果某一行满足某个条件,那么修改/删除这一行。这时候不要忘记原样输出别的行!
如果单纯地
print
会多出一些空白行,这是因为print
的时候末尾自带一个换行符。解决方法有两种
(1) Python2.X
去掉末尾的换行,strip
默认删除空白符(包括'\n', '\r', '\t', ' ')line.rstrip() print line
(2) Python3.X
print()
函数有个参数是end
,代表以什么结尾,默认是\n
,我们用空字符做结尾print(line, end='')