Python中sys.stdin和fileinput讀取標準輸入

源自《Python Linux系統管理與自動化運維》第3章打造命令行工具。

1. 使用sys.stdin和fileinput讀取標準輸入

衆所周知,Shell腳本具有一個其他腳本語言都沒有的優點,那就是管道。管道可以銜接不同的Linux命令,通過管道,我們可以使用多個簡單的命令來實現一個複雜的功能。管道如此強大,因此,我們希望在Python語言中使用管道來結合Python語言和Shell腳本的優勢。

在Python標準庫的sys庫中,有三個文件描述符,分別是stdin、stdout和stderr,這三個文件描述符分別代表標準輸入、標準輸出和錯誤輸出。我們不需要調用open函數打開這幾個文件就可以直接使用。例如,我們有一個名爲read_stdin.py的文件,該文件僅僅是從標準輸入中讀取內容,然後打印到命令行終端。文件內容如下:

from __future__ import print_function  
import sys  
 
for line in sys.stdin:  
    print(line, end="") 

接下來,我們就可以像Shell腳本一樣,通過標準輸入給該程序輸入內容。如下所示:

cat /etc/passwd | python read_stdin.py  
python read_stdin.py < /etc/passwd  
python read_stdin.py - 

sys.stdin是一個普通文件對象,除了從標準輸入讀取內容以外,並沒有特殊之處。我們也可以使用sys.stdin調用文件對象的方法。如調用read函數讀取標準輸入中的所有內容,調用readlines函數將標準輸入的內容讀取到一個列表中。如下所示:

from __future__ import print_function  
import sys  
 
def get_content():  
    return sys.stdin.readlines()  
 
print(get_content()) 

3.1.2 使用sys.stdin和fileinput讀取標準輸入
《Python Linux系統管理與自動化運維》第3章打造命令行工具,本章介紹瞭如何使用Python語言解析ini格式的配置文件以及如何使用Python語言解析命令行參數,緊接着,本章介紹了Python標準庫中的logging庫,在本章最後,我們介紹瞭如何使用開源項目打造功能更加強大的命令行工具。本節爲大家介紹使用sys.stdin和fileinput讀取標準輸入。

作者:賴明星來源:機械工業出版社|2017-09-28 16:35 收藏 分享
3.1.2 使用sys.stdin和fileinput讀取標準輸入

衆所周知,Shell腳本具有一個其他腳本語言都沒有的優點,那就是管道。管道可以銜接不同的Linux命令,通過管道,我們可以使用多個簡單的命令來實現一個複雜的功能。管道如此強大,因此,我們希望在Python語言中使用管道來結合Python語言和Shell腳本的優勢。

在Python標準庫的sys庫中,有三個文件描述符,分別是stdin、stdout和stderr,這三個文件描述符分別代表標準輸入、標準輸出和錯誤輸出。我們不需要調用open函數打開這幾個文件就可以直接使用。例如,我們有一個名爲read_stdin.py的文件,該文件僅僅是從標準輸入中讀取內容,然後打印到命令行終端。文件內容如下:
from future import print_function
import sys

for line in sys.stdin:
print(line, end="")
接下來,我們就可以像Shell腳本一樣,通過標準輸入給該程序輸入內容。如下所示:
cat /etc/passwd | python read_stdin.py
python read_stdin.py < /etc/passwd
python read_stdin.py -
sys.stdin是一個普通文件對象,除了從標準輸入讀取內容以外,並沒有特殊之處。我們也可以使用sys.stdin調用文件對象的方法。如調用read函數讀取標準輸入中的所有內容,調用readlines函數將標準輸入的內容讀取到一個列表中。如下所示:
from future import print_function
import sys

def get_content():
return sys.stdin.readlines()

print(get_content())
awk是Linux下一個廣泛使用的工具,從筆者的使用角度來說,有了sys.stdin,幾乎可以不用awk語言。一方面,我們可以將Python程序與Linux下的管道進行較好的結合;另一方面,Python語言具有比awk應用領域廣泛、可讀性好、功能強大、語法清晰等諸多優點。因此,我們完全可以在Linux下使用Python語言替代awk進行數據處理。

如果讀者熟悉awk,可能知道awk對多文件處理也提供了支持。在Python中,我們還可以使用fileinput進行多文件處理。fileinput是Python語言的一個標準庫,它提供了比sys.stdin更加通用的功能。使用fileinput,可以依次讀取命令行參數中給出的多個文件。也就是說,fileinput會遍歷sys.argv[1:]列表,並按行依次讀取列表中的文件。如果該列表爲空,則fileinput默認讀取標準輸入中的內容。

fileinput的使用非常簡單,大部分情況下,我們直接調用fileinput模塊的input方法按行讀取內容即可。例如,下面是一個名爲read_from _fileinput.py的文件。在這個文件中,我們先導入fileinput模塊,然後在for循環中遍歷文件內容。如下所示:

#!/usr/bin/python  
from __future__ import print_function  
import fileinput  
 
for line in fileinput.input():  
    print(line, end="") 

3.1.2 使用sys.stdin和fileinput讀取標準輸入
《Python Linux系統管理與自動化運維》第3章打造命令行工具,本章介紹瞭如何使用Python語言解析ini格式的配置文件以及如何使用Python語言解析命令行參數,緊接着,本章介紹了Python標準庫中的logging庫,在本章最後,我們介紹瞭如何使用開源項目打造功能更加強大的命令行工具。本節爲大家介紹使用sys.stdin和fileinput讀取標準輸入。

作者:賴明星來源:機械工業出版社|2017-09-28 16:35 收藏 分享
3.1.2 使用sys.stdin和fileinput讀取標準輸入

衆所周知,Shell腳本具有一個其他腳本語言都沒有的優點,那就是管道。管道可以銜接不同的Linux命令,通過管道,我們可以使用多個簡單的命令來實現一個複雜的功能。管道如此強大,因此,我們希望在Python語言中使用管道來結合Python語言和Shell腳本的優勢。

在Python標準庫的sys庫中,有三個文件描述符,分別是stdin、stdout和stderr,這三個文件描述符分別代表標準輸入、標準輸出和錯誤輸出。我們不需要調用open函數打開這幾個文件就可以直接使用。例如,我們有一個名爲read_stdin.py的文件,該文件僅僅是從標準輸入中讀取內容,然後打印到命令行終端。文件內容如下:
from future import print_function
import sys

for line in sys.stdin:
print(line, end="")
接下來,我們就可以像Shell腳本一樣,通過標準輸入給該程序輸入內容。如下所示:
cat /etc/passwd | python read_stdin.py
python read_stdin.py < /etc/passwd
python read_stdin.py -
sys.stdin是一個普通文件對象,除了從標準輸入讀取內容以外,並沒有特殊之處。我們也可以使用sys.stdin調用文件對象的方法。如調用read函數讀取標準輸入中的所有內容,調用readlines函數將標準輸入的內容讀取到一個列表中。如下所示:
from future import print_function
import sys

def get_content():
return sys.stdin.readlines()

print(get_content())
awk是Linux下一個廣泛使用的工具,從筆者的使用角度來說,有了sys.stdin,幾乎可以不用awk語言。一方面,我們可以將Python程序與Linux下的管道進行較好的結合;另一方面,Python語言具有比awk應用領域廣泛、可讀性好、功能強大、語法清晰等諸多優點。因此,我們完全可以在Linux下使用Python語言替代awk進行數據處理。

如果讀者熟悉awk,可能知道awk對多文件處理也提供了支持。在Python中,我們還可以使用fileinput進行多文件處理。fileinput是Python語言的一個標準庫,它提供了比sys.stdin更加通用的功能。使用fileinput,可以依次讀取命令行參數中給出的多個文件。也就是說,fileinput會遍歷sys.argv[1:]列表,並按行依次讀取列表中的文件。如果該列表爲空,則fileinput默認讀取標準輸入中的內容。

fileinput的使用非常簡單,大部分情況下,我們直接調用fileinput模塊的input方法按行讀取內容即可。例如,下面是一個名爲read_from _fileinput.py的文件。在這個文件中,我們先導入fileinput模塊,然後在for循環中遍歷文件內容。如下所示:
#!/usr/bin/python
from future import print_function
import fileinput

for line in fileinput.input():
print(line, end="")
fileinput讀取內容比sys.stdin更加靈活。fileinput既可以從標準輸入中讀取數據,也可以從文件中讀取數據。如下所示:

cat /etc/passwd | python read_from_fileinput.py  
python read_from_fileinput.py < /etc/passwd  
python read_from_fileinput.py /etc/passwd  
python read_from_fileinput.py /etc/passwd /etc/hosts 

因爲fileinput可以讀取多個文件的內容,所以,fileinput提供了一些方法讓我們知道當前所讀取的內容屬於哪一個文件。fileinput中常用的方法有:

filename:當前正在讀取的文件名;

fileno:文件的描述符;

filelineno:正在讀取的行是當前文件的第幾行;

isfirstline:正在讀取的行是否當前文件的第一行;

isstdin fileinput:正在讀取文件還是直接從標準輸入讀取內容。

這些方法的使用也非常簡單,如下所示:

#!/usr/bin/python  
from __future__ import print_function  
import fileinput  
 
for line in fileinput.input():  
    meta = [fileinput.filename(), fileinput.fileno(), fileinput.filelineno(),  
            fileinput.isfirstline(), fileinput.isstdin()]  
    print(*meta, end="")  
    print(line, end="") 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章