cndaqiang Web Linux DFT

python: 格式化输入输出、文件操作

2017-10-01
cndaqiang
RSS

一些函数

print

输出字符串,列表等

print('hello')
print(str1,str2,str3)  #连接输出,中间以空格隔开
print(list)

print每执行一次,输出后最后默认加一个回车,可以print(str1,edn=’结束内容’),指定输出后的内容

>>> print('a');print('b')
a
b 
>>> print('a',end='');print('b')
ab
>>> print('a',end=' ');print('b')
a b

print输出不换行, 则指定end=''

格式化输出

  • %s — 字符串
  • %d — dec十进制
  • %x — hex 十六进制
  • %d — dec 十进制
  • %o — oct 八进制
  • %f — 浮点数
  • %m.nf — 整数部分m个,不够补空格,小数部分n个
  • str.zfill(n)在前面补0凑够n位

更多格式先略

>>> print('%x' %23)
17
>>> str='hello,%d,%x,%o' %(45,45,45)
>>> print(str)
hello,45,2d,55
>>> str(2.2).zfill(4)
'02.2'
>>> str('21').zfill(4)
'0021'
>>> str('ab').zfill(4)
'00ab'

format

Python2.6 开始,新增了一种格式化字符串的函数 str.format()
基本语法是通过{}:来代替以前的%
用于print(str.format())格式化输出很好
以下语法摘自参考菜鸟教程

>>>"{} {}".format("hello", "world")    # 不设置指定位置,按默认顺序
'hello world'
 
>>> "{0} {1}".format("hello", "world")  # 设置指定位置
'hello world'
 
>>> "{1} {0} {1}".format("hello", "world")  # 设置指定位置
'world hello world'

也可设置参数

print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))
 
# 通过字典设置参数
site = {"name": "菜鸟教程", "url": "www.runoob.com"}
print("网站名:{name}, 地址 {url}".format(**site))
 
# 通过列表索引设置参数
my_list = ['菜鸟教程', 'www.runoob.com']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list))  # "0" 是必须的

数字格式
进制





文件操作

文件读写

推荐使用with打开,这样在遇到文件读写IOError时会自动调用f.close(),保证文件正常关闭

with open(文件名,模式) as f:
	print(f.read())

打开文件

open(文件名,模式)
#如
f=open('../test.txt','w')
  • 文件名使用字符串,支持绝对路径相对路径
  • 模式(引自传智播客)
访问模式 说明
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
--- -----------
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
--- -----------
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
--- -----------
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

关闭文件

f.close()

写入数据

写入后文件中的光标自动移位

f = open('test.txt', 'w')
f.write('hello world, i am here!')
f.close()

读取数据

读取后文件中的光标自动移位

  • read(N) 读取N个字符,无N读取所有
  • readlines() 一次性读取,每行为一个字符串组成list
  • readline() 读取一行,返回字符串
    f = open('test.txt', 'r')
    con=f.read()
    f.close()
    

    大文件时,逐行读取然后复制写入

    读写位置

  • tell()
  • seek(offset,from)
    seek偏移量
    from:起始位置:0文件开头1当前位置2文件末尾
    #统计行数,并移至开头
    f=open(inputfile)
    rownum=len(f.readlines())
    ierror=f.seek(0,0)
    

示例

with open(inputfile,'r') as f:
    for i in np.arange(4): f.readline() #跳过前4行
    #读入剩下所有数据
    data=[ [ float(i) for i in line.split() ] for line in f.readlines() ] 
    data=np.array(data)
spectrum=data[:,[0,2,3,4]] #提取一些数据

判断文件是否读至结尾

python中判断readline读到文件末尾

    line=f.readline()
    if not line:      #等价于if line == "":
        break

加速文件读取速度

用readlines()比for循环readline快太多了,下面多次重复测试,readlines的速度都是9s左右,很快
读入后split再变成数字的numpy,还真是readline()最快,没找到加速方法….

os模块

文件重命名删除

import os
os.rename("old_name","new_name")
os.remove("name")
os.mkdir("目录名")
os.getcwd() #获取当前路径
os.chdir("路径")
os.listdir("路径") #ls
os.rmdir("目录名") #rmdir
os.path.exists("文件/目录") #检查文件/目录是否存在
os.path.isfile("文件") #检查文件是否存在

非空目录不能删除,使用下面删除

import shutil
shutil.rmtree(banddir, ignore_errors=True)

执行系统命令

>>> b=os.system("grep a_1 "+inputfile)
                    a_1    11.999994   0.000000   0.000000
>>> b
0
>>> b=os.popen("grep a_1 "+inputfile)
>>> b.readlines()
['                    a_1    11.999994   0.000000   0.000000\n']

获取进程pid

>>> os.getpid() #当前进程
66021
>>> os.getppid() #父进程
61928

其他有趣

更新屏幕上的内容

不断刷新,如显示进度条

            sys.stdout.write("\rReadming wfc(%4.2f%%)"%( (ik*nbnd+ibnd+1)/(nkstot*nbnd)*100.0 )+end )

报错

文件中有特殊的字符,删除

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa6 in position 595: invalid start byte

特殊字符

!¦¤t=t2?t1 for the calculation of Uk(t2,t1) in tddft, 1 a.u.=0.048378 fs

本文首发于我的博客@cndaqiang.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!


目录

访客数据