pythonsysstdin
❶ python語言中的如何輸入編號叫什麼
Python 默認腳本文件都是 ANSCII 編碼的,當文件 中有非 ANSCII 編碼范圍內的字元的時候就要使用"編碼指示"來修正。 一個mole的定義中,如果.py文件中包含中文字元(嚴格的說是含有非anscii字元),則需要在第一行或第二行指定編碼聲明:
# -*- coding=utf-8 -*-或者 #coding=utf-8 其他的編碼如:gbk、gb2312也可以; 否則會出現類似:SyntaxError: Non-ASCII character '/xe4' in file ChineseTest.py on line 1, but no encoding declared; see http://www.pytho for details這樣的異常信息;n.org/peps/pep-0263.html
命令查看腳本默認的編碼方式
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>>
2.2 python中的編碼與解碼
先說一下python中的字元串類型,在python中有兩種字元串類型,分別是str和unicode,他們都是basestring的派生類;str類型是一個包含Characters represent (at least) 8-bit bytes的序列;unicode的每個unit是一個unicode obj;所以:
len(u'中國')的值是2;len('ab')的值也是2;
在str的文檔中有這樣的一句話:The string data type is also used to represent arrays of bytes, e.g., to hold data read from a file. 也就是說在讀取一個文件的內容,或者從網路上讀取到內容時,保持的對象為str類型;如果想把一個str轉換成特定編碼類型,需要把str轉為Unicode,然後從unicode轉為特定的編碼類型如:utf-8、gb2312等;
2.2.1 print 語句解釋編碼問題
print 是列印默認的編碼方式,相當於對任何對象encode編碼轉化成str對象。默認是gbk的編碼就是對Unicode進行自動的gbk編碼,再按照gbk編碼輸出。
當print語句碰到一個unicode目標的時候,會用當前python shell環境的默認編碼格式首先對unicode對象進行encode(此時unicode對象已經變成了一個str對象了),然後再以默認編碼格式為基礎,根據其包含的漢字和編碼的對應規則,把這個str對象解釋成中文並顯示出來。但是當print語句碰到的直接是個str目標的時候,就不管其從unicode轉到str時用的編碼格式是什麼,直接用默認編碼格式的對應規則來解釋成中文。所以,當unicode對象轉換成str時的編碼格式和print語句的默認編碼格式不一致的時候就會出現亂碼現象。比如在cmd的python shell裡面:
復制代碼
復制代碼
證明Python 系統默認編碼gbk
>>> s= '你好'
>>> s
'\xc4\xe3\xba\xc3'
>>> s = u'你好'
>>> s
u'\xc4\xe3\xba\xc3'
>>> s = '你好'
>>> s
'\xc4\xe3\xba\xc3'
>>> print type(s)
<type 'str'>
>>>unicode 編碼列印錯誤,print 解析字元串而不是Unicode 編碼
>>> s = u'你好'
>>> print s
ÄãºÃ
>>>uni = u'你好' #存入一個unicode對象
>>>print uni
你好 #可以正常顯示 相當於Unicode.encode(gbk)
>>>uni.encode("gbk")
'\xc4\xe3\xba\xc3' #顯示的是個str對象了,如果type(uni.encode("gbk"))得到的就是str對象
>>>print uni.encode("gbk")
你好 #可以正常顯示,因為在cmd下的pythonshell里默認個編碼格式就是gbk,gbk解析
>>>uni.encode("utf-8")
'\xe4\xbd\xa0\xe5\xa5\xbd' #可以看到,encode用的編碼格式不同,編成的字元串也是不同的
>>>print uni.encode("utf-8")
浣犲ソ #亂碼,因為用了gbk中漢字和字元串編碼格式對應規則去解釋了用utf-8編碼成的字元串。解釋的編碼格式不對應。
#######さらに######
>>>print '\xc4\xe3' #自己寫出來的這么個字元串(前面不加r)的話也會被print解釋成中文,按照編碼格式輸出
你
>>>print uni.encode("utf-8").decode("gbk")
浣犲ソ
'''
亂碼,而且和上面的亂碼一樣,這是因為,在uni被utf-8 encode之後,這個對象變成了str對象,是'\xe4\xbd\xa0\xe5\xa5\xbd' 這個。
後來,它又被按照gbk的規則解碼,又變回了unicode,但是此時它在內存里的二進制數據已經和最初的uni不一樣了。
最初的uni,應該是'\xc4\xe3\xba\xc3'.decode("gbk"),而現在的這個東西,他decode之前的字元串已經變過了。
這么一個東西再拿去print,又把它編碼成了gbk格式,相當於前面那步decode沒有做,變回了'\xe4\xbd\xa0\xe5\xa5\xbd'。
再解釋成漢字,當然就和最開始用uni編碼成utf-8格式再解釋成漢字的亂碼一樣了
'''
復制代碼
2.2.2 腳本print 列印的正確方式
上面已經證明了系統的默認編碼方式是gbk,就是print 最後正確的編碼方式應該是gbk
兩種解決編碼不匹配的情況:
一是明確的指示出 s 的編碼方式
# -*- coding: utf-8 -*-
s = '中文'
s.decode('utf-8').encode('gb2312')
二是更改 sys.defaultencoding 為文件的編碼方式
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys) # Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入
sys.setdefaultencoding('utf-8')
str = '中文'
str.encode('gb2312')
三、實踐經驗中爬取數據的獲得
復制代碼
# -*- coding: utf-8 -*-
'''
#加油兩個字可以很好的比較編碼正確和錯誤
#### 錯誤的處理方式,
s = "中文"
print s
#這里print就不是輸出gbk的編碼,是按照頭文件utf-8的格式輸出
# 結果:中文
print s.decode('utf-8')
#結果中文,s進行解碼稱為Unicode,print列印就和系統print列印一樣自動將Unicode進行
#解碼,不用encode編碼也能輸出,但是最好轉化成為字元串輸出。
上面實例就是錯誤使用編碼,錯誤使用編碼會出現個別字體的亂碼。
'''
'''
要點1、聲明頭文件# -*- coding: utf-8 -*- 說明所有的代碼和中文是utf-8的編碼方式
要點2、print輸出函數輸出到前台cmd中的默認系統編碼方式是GBK,
要點3、盡量將Unicode轉化成為字元串str (gbk或者utf-8),再去處理。
#unicode 轉化成為字元串
s = u'加油'
print s
#結果:加油。原因:系統自動將Unicode升級gbk編碼成為字元串,然後系統print 列印gbk
print s.encode('utf-8')
#結果:鍔犳補。錯誤原因:Unicode 編碼成為utf-8的字元串形式,但是print列印系統是gbk的,編碼沖突。
print s.encode('gbk')
#結果:加油。原因:和print s等價,認為編碼了gbk,系統列印
ss = "加油"
print ss
#結果:鍔犳補。原因:ss為utf-8的字元串str,print 列印的對應編碼字元串是gbk的,所以編碼沖突。
print ss.decode('utf-8').encode('gbk')
#結果:加油。原因:ss首先從字元串編碼utf-8解碼成為unicode,然後進行編碼gbk,等價使用print ss.decode('utf-8')。
'''
'''
3.1python中關於中文轉換url編碼的問題
爬蟲的時候我們經常會碰到中文鏈接編碼出現變換的問題,
例如'麗江'中文在url的地址編碼卻是'%E4%B8%BD%E6%B1%9F',
因此需 要做一個轉換。這里我們就用到了模塊urllib。
'''
import urllib
data = '麗江'
print data.decode('utf-8').encode('gbk')
#對utf-8的中文編碼
print urllib.quote(data)
#那我們想轉回去呢?
print urllib.unquote('%E4%B8%BD%E6%B1%9F').decode('utf-8').encode('gbk')
'''
'麗江'在網頁編碼是gbk的轉換碼是'%C0%F6%BD%AD',utf-8中的轉化碼是'%E4%B8%BD%E6%B1%9F',其實是編碼問題。
網路的是gbk,其他的一般網站比如google就是utf8的。所以可以用下列語句實現。
'''
#江蘇課題的編碼轉化
import sys,urllib
s = '江蘇'
print urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))
print urllib.quote(s.decode(sys.stdin.encoding).encode('utf8'))
for place in ['南京','無錫','徐州','常州','蘇州','鹽城','南通','連雲港','淮安','鹽城','揚州']:
print urllib.quote(place)
####################
#結果:
'''
>>>
麗江
%E4%B8%BD%E6%B1%9F
麗江
%E4%B8%BD%E6%B1%9F
%E6%B6%93%E8%8A%A5%E7%9D%99
>>>
'''
❷ Python基礎編程——標准庫之fileinput與time模塊
在前一節我們介紹了標准庫的sys模塊和os模塊,本節將介紹標准庫的fileinput模塊和time模塊。
fileinput模塊能夠讓我們輕松地迭代一系列文本文件中的行。
fileinput模塊中一些重要的函數,也是我們在實際開發中需要經常用到的,具體如下表所示:
fileinput.input(): fileinput模塊中最重要的函數,它返回一個可在for循環中進行迭代的對象。
fileinput. filename(): 返回當前文件(即正在處理的行所屬的文件)的文件名。
fileinput. lineno(): 返回當前行的編號。
fileinput. filelineno(): 返回當前行在當前文件中的行號。
fileinput. isfirstline(): 在當前行為當前文件中的第一行時返回True,否則返回False。
fileinput. isstdin():在當前文件為sys.stdin時返回True,否則返回False。
fileinput. nextfile():關閉當前文件並跳到下一個文件,且計數時忽略跳過的行。
fileinput. close():關閉整個文件鏈並結束迭代。
上面關於介紹的fileinput模塊中的函數的實例用法如下my_fileinput.py程序所示:
time模塊包含用於獲取當前時間、操作時間和日期、從字元串中讀取日期、將日期格式化為字元串的函數。日期可表示為實數,也可表示為包含9個整數的元組。例如,元組(2021, 6, 8, 22, 13, 56, 1, 21, 0)表示2021年6月8日22時13分56秒。日期元組中各欄位含義如下表所示:
秒的取值范圍為0~61,這考慮到了閏一秒和閏兩秒的情況。夏令時數字是一個布爾值(True或False),但如果你使用-1,那麼mktime[將時間元組轉換為時間戳(從新紀元開始後的秒數)的函數]可能得到正確的值。
模塊time中有一些重要的函數,也是我們在實際開發中需要經常用到的,具體如下表所示:
time.asctime(): 將當前的時間轉換成字元串形式,如果不想使用當前時間,也可以傳遞一個時間元組作為參數。如果要使用更復雜的時間格式化,可以使用strftime()函數。
time.localtime(): 將一個實數轉換成時間元組(這里是本地時間),如果要轉換成國際標准時間,應該使用time.gmtime()函數。需要注意這里的實數是一個從新紀元開始後的秒數,世界新紀元指的是 1970年1月1日0時0分0秒,如果是本地新紀元的話,需要加上本地的時區時間。
time.mktime(): 將時間元組轉換成從新紀元開始後的描述,這與time.local()函數功能相反。
time.sleep(): 讓解釋器等待指定的秒數,即程序暫停指定的秒數。
time.strftime(): 將時間元組按照指定的格式轉換成字元串格式。常用的格式符有:%Y表示年,%m表示月,%d表示日,%H表示時,%M表示分,%S表示秒。更多格式符可參考官方標准文檔。
上面關於介紹的time模塊中的函數的實例用法如下my_time.py程序所示:
注意:另外還有兩個較新的關於時間的模塊:datetime和timeit,大家可執行查閱相關文檔。
本節主要介紹了以下內容:
如果有需要文中小程序的可以私信我喲!
歡迎大家轉發、評論!
#Python# #python# #Python基礎# #python打卡# #Python編程從入門到實踐#
❸ sys是python中的標准庫嗎
是的,sys模塊主要是針對與Python解釋器相關的變數和方法。
下邊是sys常用的變數和方法說明:
sys.argv #獲取命令行參數列表,第一個元素是程序本身
sys.exit(n) #退出Python程序,exit(0)表示正常退出。當參數非0時,會引發一個SystemExit異常,可以在程序中捕獲該異常
sys.version #獲取Python解釋程器的版本信息
sys.maxsize #最大的Int值,64位平台是2**63 - 1
sys.path #返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform #返回操作系統平台名稱
sys.stdin #輸入相關
sys.stdout #輸出相關
sys.stderr #錯誤相關
sys.exc_info() #返回異常信息三元元組
sys.getdefaultencoding() #獲取系統當前編碼,默認為utf-8
sys.setdefaultencoding() #設置系統的默認編碼
sys.getfilesystemencoding() #獲取文件系統使用編碼方式,默認是utf-8
sys.moles #以字典的形式返回所有當前Python環境中已經導入的模塊
sys.builtin_mole_names #返回一個列表,包含所有已經編譯到Python解釋器里的模塊的名字
sys.right #當前Python的版權信息
sys.flags #命令行標識狀態信息列表。只讀。
sys.getrefcount(object) #返回對象的引用數量
sys.getrecursionlimit() #返回Python最大遞歸深度,默認1000
sys.getsizeof(object[, default]) #返回對象的大小
sys.getswitchinterval() #返回線程切換時間間隔,默認0.005秒
sys.setswitchinterval(interval) #設置線程切換的時間間隔,單位秒
sys.getwindowsversion() #返回當前windwos系統的版本信息
sys.hash_info #返回Python默認的哈希方法的參數
sys.impleme
❹ Python的一個簡單問題:for line in sys.stdin:
1、安裝python一般都會有一個互動式陪梁解釋器,點擊並進入python交互界面。
❺ python如何判斷stdin裡面是否有數據
解決方案:
select,poll等監櫻仔讓視標准輸入文件戚辯句柄(0),一旦有I/O操作就列印數據
使用sys.stdin.isatty()函脊局數
import
sys
def
check_method_1():
import
select
if
select.select([sys.stdin,
],
[],
[],
0.0)[0]:
print
"Have
data!"
for
line
in
sys.stdin:
print
line
print
'end'
else:
print
"No
data"
def
check_method_2():
if
not
sys.stdin.isatty():
#
isatty()
->
bool.
True
if
the
file
is
connected
to
a
TTY
device.
print
"Have
data!"
for
line
in
sys.stdin:
print
line
print
'end'
else:
print
"No
data"
❻ python語言中sys.stdin有哪些方法(屬性函數)可以調用
>>> dir(sys.stdin)
['_CHUNK_SIZE', '__class__', '__delattr__', '__doc__', '__enter__', '__eq__', '
_exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__
nit__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__red
ce__', '__rece_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__
ubclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWrit
ble', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'f
ush', 'isatty', 'line_buffering', 'name', 'newlines', 'read', 'readable', 'read
ine', 'readlines'鉛哪手, 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write',
]
你用的IDLE?那東西是包裝過的緩銷的,那不是命令行里讀取了,直接用原生的stdin肯槐嫌定是不行的。
❼ python項目輸出到sys和命令行中的不一樣
演算法崗筆試的編程題往往是規定輸入輸出格式的。並且為了在線測試通過,得嚴格遵守示例的輸入輸出格式。
大致總結了以下幾種情況,以Input和sys的readline的使用為主
1、僅需團閉輸入一個參數
直接使燃游用Input或readline即可或者用def的方法進行操作
這兩者的返回值均為str,用作數字時需轉換(見2)
s=input()
import sys
s = sys.stdin.readline()
2、同一行輸入幾個不同的參數
例:需要獲取兩個參數m n
s=input()
si=s.split(' ')
n=int(si[0])
m=int(si[1])
使用map函數會更方便一些
m,n = map(int, input().split())
3、同一行輸入一組參數
主要是針對批量轉成需要的類型(以Int為例)
import sys
x = [int(i) for i in sys.stdin.readline().split()]
x = [int(i) for i in input().split()]
x = list(map(int , input().split()))
上面兩個等價,map的用法參見:http://www.runoob.com/python/python-func-map.html
4、多行輸入不同參數
一種是使用sys里的readlines另一種是多次使用input或readline
例:網易的解救小易問題,第一行輸入個數,第二行第三行分別輸入橫縱坐標
import sys
data = sys.stdin.readlines()
#提取橫縱坐標
x = [int(i) for i in data[1].split()]
y = [int(i) for i in data[2].split()]
使用Input或readline的話,直接按之前的方法多行疊加
5、輸入矩陣
輸入矩陣的話,需要將多行輸入的數存在一個二維列表裡
例:第一行輸入矩陣維度n m,下面輸入這個大小的矩陣
try:
n,m = map(int,input().split())
except:
break
a = []
for i in range(n):
b = list(map(int,input().split()))
a.append(b)
註:加上了try except結構,是因為在牛客網寫一道矩陣操作的題目時,不加會報錯輸出為空,但單獨調試並沒有問題。目前還不清楚這是因為牛客網的bug還是說有這么寫的必要。參考了很多題目的正確代碼,也只有這一題大家的答案都加上了這個結構。
6、除去不必要的輸入
還是以上面的解救小易問題為例,假如規定的輸入數據以逗號隔開(之前一直默認空格隔開),那麼需要去除掉這些逗號輸入
其實也就是split的用法:http://www.runoob.com/python3/python3-string-split.html
上面的split參數一直取空,皮或銷也就是按默認用空格分割且不用規定分割次數
那麼直接在上面的代碼中,split(',')即可
7、輸出數據的處理
輸出往往沒有那麼多情況,以join的使用為主:http://www.runoob.com/python3/python3-string-join.html
要注意的是,join只能連接字元串,所以要進行格式轉換
list=[1,2,3]
print(' '.join(str(i) for i in list ))
如果在前序處理中已經轉成字元串,直接使用' '.join(list)即可,如需逗號分隔同理
相關資源:Python中輸入和輸出(列印)數據實例方法_python輸入輸出函數實例...
❽ python錯誤sys.stdin這一行報錯unhandled TypeError AsyncFile object is not iterable。代碼如下
python test.py<input.txt
我也測試了一下,沒有其他錯誤。除纖迅了geidianli 指尺豎迅出陵此的錯誤。
❾ Python. sys.stdin.read()的用法如果需要互動式的發送數據,你需要發送C
read讀賀差取數據 ctrl+d是結束輸入御拍差 ,read並不會像input那樣遇到回車就返回鎮皮讀取的數據
它會緩存或者 等到ctrl d再讀取數據