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再读取数据