Python输入输出及其他

时间:2022-04-05 14:41:48

print用法

print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果。
回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return
换行 \n 本义是光标往下一行(不一定到下一行行首),控制字符可以写成LF,即Line Feed
这里的换行会因不同系统而不同windows的换行是\r\n,unix的是\n,mac的是\n。在不同的操作系统这几个字符表现不同,比如在WIN系统下,这两个字符就是表现的本义,在UNIX类系统,换行\n就表现为光标下一行并回到行首,在MAC上,\r就表现为回到本行开头并往下一行,至于ENTER键的定义是与操作系统有关的。通常用的Enter是两个加起来。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

 

1、输出进度条

要想输出进度条,我们必须再原地输出才能保证他是一个进度条,最简单的办法就是再输出完毕后把光标移动到行首,继续在那里输出更长的进度条即可实现,新的更长的进度条把旧的短覆盖,就形成了动画效果。转义符\r就可以把光标移动到行首而不换行,转义符\n就把光标移动到行首并且换行。

 

在python中,输出stdout(标准输出)可以使用sys.stdout.write

import time

import  sys
for  in  range ( 101 ):
     sys.stdout.write( '\r' )
     sys.stdout.write( "%s%% |%s"  % ( int (i % 101 ),  int (i % 101 ) * '#' ))
     sys.stdout.flush()
     time.sleep( 0.5 )
 
sys.stdout.write( '\n' )

 

2、输出三角形

 

#左上三角格式输出九九乘法表

 for i in range(1,10):

     for j in range(i,10):

         print("%d*%d=%2d" % (i,j,i*j),end=" ")

     print("")

 Python输入输出及其他

注:乘法算式按行输出,与完整格式相比,内层循环范围为i~9,当外层循环的i逐渐递增时,每行输出的算式个数会越来越少,print("")表示换行,不输出这句的话输出的乘法表格式错乱。

 

 #右上三角格式输出九九乘法表

 for i in range(1,10):

     for k in range(1,i):

         print (end="       ")

     for j in range(i,10):

             print("%d*%d=%2d" % (i,j,i*j),end=" ")

     print("")

 Python输入输出及其他

 

注:相比左上三角形,内层循环语句多了两句(代码标红处),由于每个算式所占的位置为7个字节,所以多余前面空出的地方输出相应的空格数,在Python中不能直接写print("      ")语句表示输出空格,必须添加end关键字,表示结尾以等号右边的内容输出,与后面的右上和左上的差别相似。

 

等腰三角形

import sys
print('请输入打印行数:')
x=input()
x=int(x)
for i in range(x):
for j in range(0, x - i):
print(end=" ")
for k in range(x - i, x):
print("▲", end=" ")
print("")

Python输入输出及其他

 

 3、输出图形打印X型

O.....O
.O...O.
..O.O..
...O...
..O.O..
.O...O.
O.....O

for line in range(0,3):
    for star in range(line):
        print(".",end="")
    print("O",end="")
    for star in range(5-2*line):
        print(".",end="")
    print("O",end="")
    for star in range(line):
        print(".",end="")

    print()
    
for line in range(1,2):
    for star in range(3):
        print(".",end="")
    print("O",end="")
    for star in range(3):
        print(".",end="")        

    print()

for line in range(2,-1,-1):
    for star in range(line):
        print(".",end="")
    print("O",end="")
    for star in range(5-2*line):
        print(".",end="")
    print("O",end="")
    for star in range(line):
        print(".",end="")
        
    print()



杨辉三角定义如下:

          1

         / \

        1   1

       / \ / \

      1   2   1

     / \ / \ / \

    1   3   3   1

   / \ / \ / \ / \

  1   4   6   4   1

 / \ / \ / \ / \ / \

1   5   10  10  5   1

 

把每一行看做一个list,试写一个generator,不断输出下一行的list

一般的思路是,首先在每一行输出一个1,随后通过循环,位置i(从2开始)的数是上一行ii-1位置的数之和,当i与上一行数字个数相同时,循环终止,最后再添加进一个1,形成新的一行。

一种写法如下:

def triangles():#杨辉三角的一种生成方法

   l = [1]

   while True :

        yield l

        for i in range ( 1,len (l) ) :

            l [i] =  h [i] + h [i-1]

        l.append (1)

        h = l[:]

一开始h里面没有数,却也能够正常执行?主要是对于生成器的yield机制不明白,以及对于range的用法不是特别清楚。以下就这两点分别解释。首先,当函数中出现了yield之后,该函数就不再被视为函数,而视为一个生成器。此时,整个函数被使用的语句流程会发生改变,一般的函数都是调用的时候从函数入口进,发现return或函数执行完毕后返回,而生成器函数则是每次调用函数执行,执行到yield返回,下次再调用函数的时候从上次yield返回处继续执行。其次,range的用法中是,如果是【range(x,x)其中x是常量】的形式,range依然返回空。故在上述代码的for循环中,由于在第一次试图循环的时候,后面的range要么是range(1,1)要么是range(0),故都会成功避开i或者h没有实际值的循环,执行接下来的部分。当第二次试图循环开始时,ih内的内容都已经满足条件了,所以就能正常运行了。

 

另外一种写法如下,运用了list的生成式:

def triangles():

   L = [1]

   while True:

       yield L

       L= [(L + [0])[i] + ([0] + L)[i] for i in range(len(L)+1)]



格式符

格式符为真实值预留位置,并控制显示的格式。格式符可以包含有一个类型码,用以控制显示的类型,如下:

%s    字符串 (采用str()的显示)

%r    字符串 (采用repr()的显示)

%c    单个字符

%b    二进制整数

%d    十进制整数

%i    十进制整数

%o    八进制整数

%x    十六进制整数

%e    指数 (基底写为e)

%E    指数 (基底写为E)

%f    浮点数

%F    浮点数,与上相同

%g    指数(e)或浮点数 (根据显示长度)

%G    指数(E)或浮点数 (根据显示长度)




Python逐行读取文件内容的方法

方法一:readline函数

=  open ( "/pythontab/code.txt" )        #返回一个文件对象  
line  =  f.readline()              #调用文件的 readline()方法  
while  line:   
     print (line, end  =  '')         # 在Python3中使用,end =''忽略换行符
     line  =  f.readline()
f.close()

缺点:速度相对较慢优点:节省内存,不需要一次性把文件内容放入内存中

 

方法二:一次读取多行数据

=  open ( "/pythontab/code.txt" )
while  1 :
     lines  =  f.readlines( 10000 )
     if  not  lines:
         break
     for  line  in  lines:
         print (line)
f.close()

一次性读取多行,可以提升读取速度,但内存使用稍大, 可根据情况调整一次读取的行数

 

方法三:直接for循环

在Python 2.2以后,我们可以直接对一个file对象使用for循环读每行数据

for  line  in  open ( "/pythontab/code.txt" ):  
     print (line)


Python输入输出及其他

 



python调用其他程序

Python3中调用cmd/shell命令有:os(os.system、os.popen。第一个无法获得返回值,第二可以获取)模块和subprocess(subprocess.call)。

 

os.system()方法

Import os

os.system('ipconfig')

如果要向程序或者脚本传递参数,可以使用空格分隔程序及多个参数。

 

启动电脑中的网易云音乐

import os

os.system(r'"D:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe"')

这段代码会启动网易云音乐,效果和我们在cmd窗口中输入 "D:\Program Files (x86)\Netease\CloudMusic\cloudmusic.exe" 效果一样。注意字符串中含有空格,所以有 r''。

 

subprocess.call()方法

(1) call

执行命令,返回状态码(命令正常执行返回0,报错则返回1)

import subprocess
subprocess.call("C:\\Program Files (x86)\\Notepad++\\notepad++.exe")
ret = subprocess.call(["ls", "-l"], shell=False) #shell为False的时候命令必须分开写
ret = subprocess.call("ls -l", shell=True)

 

(2) check_call

执行命令,如果执行成功则返回状态码0,否则抛异常

subprocess.check_call(["ls", "-l"])

subprocess.check_call("exit 1", shell=True)

 

(3) check_output

执行命令,如果执行成功则返回执行结果,否则抛异常

subprocess.check_output(["echo", "Hello World!"])

subprocess.check_output("exit 1", shell=True)

 

(4) subprocess.Popen(...)

用于执行复杂的系统命令

import subprocess

obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)     #在cwd目录下执行命令

参数

注释

args

shell命令,可以是字符串或者序列类型(如:list,元组)

bufsize

指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲

stdin, stdout, stderr

分别表示程序的标准输入、输出、错误句柄

preexec_fn

只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用

close_sfs

在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。

shell

同上

cwd

用于设置子进程的当前目录

env

用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。

universal_newlines

不同系统的换行符不同,True -> 同意使用 \n

startupinfo

只在windows下有效,将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等

createionflags

同上

 

 

 


1、卸载android手机中安装的所有第三方应用

主要是使用adb shell pm、adb uninstall 命令

 

import os

def uninstall(): 
os.popen("adb wait-for-device") 
print( "start uninstall...")
for packages in os.popen("adb shell pm list packages -3").readlines(): 
packageName = packages.split(":")[-1].splitlines()[0] 
os.popen("adb uninstall " + packageName) 
print "uninstall " + packageName + " successed."

if __name__ == "__main__": 
uninstall() 
print " "
print "All the third-party applications uninstall successed."

 

 

2、给安卓手机安装apk

创建一文件夹,放入要安装的所有apk文件,创建一文件以py为后缀,复制以下代码:

import os 
files = os.listdir(r'.') 
for file in files: 
# print(file + str(len(file)) + "---" + file[1]) 
# print(file[len(file)-3:len(file)]) 
# print(file[len(file)-3:len(file)]) 
if file[len(file)-3:len(file)] == "apk": 
#the string variable which is to storage the command will excute later 
string='adb install ' + "\"" + file + "\"" 
print(string) 
os.system(string) 

(注意:“\“” + file + "\"" , 这段代码,为了防止file的值含有空格,导致调用cmd命令安装失败,其次,apk不能为中文名,否则安装会出错)
双击文件,apk就已经安装到手机上了。

 

3、清理某路径下所有文件及文件夹的代码如下:

 1 import os
 3 dirToBeEmptied = 'D:\_Data\Python\os' #需要清空的文件夹
 4 
 5 ds = list(os.walk(dirToBeEmptied)) #获得所有文件夹的信息列表
 6 dsr = ds[::-1] #反转该列表,从最底层的文件夹开始清算
 7 
 8 for d in dsr: #遍历该列表
 9     print(d) #打印出列表项,观察规律
10     if d[2] != []: #如果该路径下有文件
11         for x in d[2]: #先将文件清理干净
12             os.remove(os.path.join(d[0], x))
13 for d in dsr: #再次遍历该列表
14     if d[1] != []: #如果该路径下有子文件夹
15         for y in d[1]: #将子文件夹清理干净
16             os.rmdir(os.path.join(d[0], y))

之所以这么麻烦,是因为 os.rmdir() 有个毛病,只能删除“空”文件夹。所以只能从最底层的文件夹开始清理,一级一级往上,才能清干净。

 

 

python中format函数用于字符串的格式化

通过关键字

1 print('{名字}今天{动作}'.format(名字='陈某某',动作='拍视频'))#通过关键字
2 grade = {'name' : '陈某某', 'fenshu': '59'}
3 print('{name}电工考了{fenshu}'.format(**grade))#通过关键字,可用字典当关键字传入值时,在字典前加**即可

通过位置

1 print('{1}今天{0}'.format('拍视频','陈某某'))#通过位置
2 print('{0}今天{1}'.format('陈某某','拍视频'))

填充和对齐

1 print('{:^14}'.format('陈某某'))  #居中
2 print('{:>14}'.format('陈某某')) #右对齐
3 print('{:<14}'.format('陈某某')) #左对齐
4 print('{:*<14}'.format('陈某某')) #右填充
5 print('{:*>14}'.format('陈某某')) #左填充
精度和类型f精度常和f一起使用
1 print('{:.1f}'.format(4.234324525254))
2 print('{:.4f}'.format(4.1))
进制转化,b o d x 分别表示二、八、十、十六进制
print('{:b}'.format(250))
print('{:o}'.format(250))
print('{:d}'.format(250))
print('{:x}'.format(250))
千分位分隔符,这种情况只针对与数字
print('{:,}'.format(100000000))
print('{:,}'.format(235445.234235))

 

 

Python中的正斜杠与反斜杠
首先,"/"左倾斜是正斜杠,"\"右倾斜是反斜杠,可以记为:除号是正斜杠一般来说对于目录分隔符,Unix和Web用正斜杠/,Windows用反斜杠,但是现在Windows

(一)目录中的斜杠们

python读文件需要输入的目录参数,列出以下例子:

path = r"C:\Windows\temp\readme.txt"

path1 = r"c:\windows\temp\readme.txt"

path2 = "c:\\windows\\temp\\readme.txt"

path3 = "c:/windows/temp/readme.txt"

打开文件函数open()中的参数可以是path也可以是path1、path2、path3。

 

path:"\"为字符串中的特殊字符,加上r后变为原始字符串,则不会对字符串中的"\t"、"\r" 进行字符串转义

path1:大小写不影响windows定位到文件

path2:用一个"\"取消第二个"\"的特殊转义作用,即为"\\"

path3:用正斜杠做目录分隔符也可以转到对应目录,并且在python中path3的方式也省去了反斜杠\转义的烦恼

python中以r或R开头的的字符串表示为非转义的原始字符串,比如:(r’^time/plus/\d{1,2}/$’, hours_ahead)