python输入多行字符串sys.stdin_python使用sys.stdin与fileinput获取标准输入

Shell脚本可以直接利用管道衔接不同的Linux命令,通过管道可以使用多个简单的命令实现复杂的功能。在Python中也希望可以利用管道。

Python的标准库sys提供了三个文件描述符:

标准输入

标准输出

错误输出

stdin

stdout

stderr

以下例子是获取标准输入,然后写入到标准输入。read_stdin.py1

2

3

4import sys

for line in sys.stdin:

sys.stdout.write(line)

接下来我们可以在命令行使用该脚本。1

2

3$ cat /etc/passwd | python read_stdin.py

$ python read_stdin.py < /etc/passwd

$ python read_stdin.py -

sys.stdin为文件描述符,故拥有文件对象的方法,我们可以使用read()方法读取标准输入的所有内容,或者使用readlines()将标准输入内容读取到一个list中。

upper.py1

2

3

4

5

6

7

8import sys

def ():

content_list = sys.stdin.readlines()

return [i.upper() for i in content_list]

for line in get_upper_list():

sys.stdout.write(line)

上述脚本中定义了get_content()函数,该函数使用sys.stdin标准输入的readlines()方法读取所有行,以列表类型保存于content_list,使用列表解析,调用每个元素(字符串类型)的upper()方法,构造一个新的列表并返回。

迭代get_upper_list()函数返回的新列表,将每一行写入标准输入。

该脚本运行效果如下:

利用sys.stdin,我们几乎可以不再使用awk。将Python与Linux管道结合,可以充分发挥Python语言的文字处理能力。

fileinput

对于awk,它可以同时处理多个文件,在Python中我们可以使用fileinput这个标准库来达到同样效果。

fileinput比sys.stdin更为通用,它可以遍历sys.argv[1:]列表(所有命令行参数)中的文件,如果该列表为空(没有提供文件名参数),则默认读取标准输入的内容。

read_from_fileinput.py1

2

3

4import fileinput

for line in fileinput.input():

print(line, end="")

上述脚本直接调用了fileinput模块的input函数,该函数返回一个FileInput实例化的可迭代对象,可以使用for循环遍历取得每一行内容。fileinput既可以从标准输入读取数据,也可以从文件中(一个或多个)读取数据。1

2

3

4

5$ python read_from_fileinput.py -

$ cat /etc/passwd | python read_from_fileinput.py # 通过管道读取passwd数据

$ python read_from_fileinput.py < /etc/passwd # 通过重定向读取passwd数据

$ python read_from_fileinput.py /etc/passwd # 直接读取passwd文件数据

$ python read_from_fileinput.py /etc/passwd /etc/hosts # 直接读取passwd与hosts文件数据

fileinput还提供了一些方法让我们知道当前读取的内容属于哪一个文件等便利的方法,常用方法如下:

filename: 当前正在读取文件的文件名 str

fileno: 文件的描述符 int

filelineno: 正在读取的行时当前文件的第几行 int

isfirstline: 正在读取的行是否是当前文件的第一行 bool

isstdin: 正在读的问价是否时从标准输入读取的 bool

nextfile: 关闭当前正在读取的文件,从下一个文件第一行开始 None

我们可以完成一个简单的脚本来展示一下fileinput的各个方法:

read_file.py1

2

3

4

5

6

7

8

9

10

11import fileinput

for line in fileinput.input():

meta = ["文件名:" + str(fileinput.filename()),

" 文件描述符:" + str(fileinput.fileno()),

" 行号:" + str(fileinput.filelineno()),

" 首行:" + str(fileinput.isfirstline()),

" 标准输入:" + str(fileinput.isstdin()) + " "]

meta_ljust = [i.ljust(9) for i in meta]

print(*meta_ljust, end="")

print(line, end="")

同时fileinput还提供了钩子函数,可以帮助去自定义文件访问的方式:

fileinput内置了两个函数:

hook_compressed: 识别并打开.gz和.bz2的压缩文件

hook_encoded: 以特定的编码格式打开文件

读取一个.gz压缩文件,如下所示:read_compressed.py1

2

3

4import fileinput

for line in fileinput.input(openhook=fileinput.hook_compressed):

print(line.decode('utf-8'), end="")

在中文windows下有读取utf-8,或在linux下读取gbk需要指定对应的编码格式,如下所示:

read_encoded.py1

2

3

4import fileinput

for line in fileinput.input(openhook=fileinput.hook_encoded(encoding="gbk")):

print(line, end="")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值