python对文件的操作
输出文件
创建一个新的文件,可以传入open的两个参数:待创建文件的外部名称和模式字符串w。将数据存入文件则调用文件对象的write方法,向其传入要存储数据的字符串,然后调用close方法关闭文件。
示例如下:
//open、write
#!/usr/bin/env python
#-*-coding:utf-8-*-
import sys, os
src_file = sys.argv[1]
des_file = sys.argv[2]
def get_content(filename):
file_t = content = open(filename, "r")
content = file_t.read()
file_t.close()
return content
def write_file(filename, content):
file_t = open(filename, "w")
file_t.write(content)
file_t.close()
if __name__ == '__main__':
src = get_content(src_file)
print src
des = write_file(des_file, src)
print get_content(des_file)
注意:
1.在w模式下打开文件,如果文件不存在,python会创建这个文件,如果文件已经存在,则会删除文件当前的内容。
2.上面用到的文件close方法是用来确定文加年内容并释放系统资源的,正常情况下,当解释其对文件对象进行垃圾回收时,文件会被自动关闭,或者python程序结束时所有打开的文件也会被关闭。
#写入临时对象
open('/mnt/haha.txt', 'w').write('hello, world') #写入临时对象
open('/mnt/haha.txt', 'r').read() #从临时对象中读取
3.有时候打开文件操作也是一件有可能失败的事情,所以我们经常使用捕获异常的机制来处理文件的操作:
#捕获异常
my_file = open('/mnt/test_file', 'w')
try:
my_file.write('this is the test file!\n')
finally:
my_file.close()
在出现异常的时候,程序会执行finally语句块的内容,即关闭文件。
但我们更加推荐with语句,这使异常的处理变得更加方便,代码如下:
with open('/mnt/test_file', 'w') as my_file:
my_file.write('this is the test file!\n')
上述文件的打开模式为w,这样每次都会把之前的内容给删除掉,如果我们指向在已存在的文件末尾进行追加,则需要修改open的打开模式为a。
//追加文本
with open('/mnt/test_file', 'a') as my_file:
my_file.write('this is apending content!\n')
输入文件
从外部文件中读取数据和写入数据一样简单,有多种方式可以对文件进行读取。关于文本读取的方式有多种:
file.read() #返回一个字符串,它包含存在文件中的所有字符
file.read(N) #返回一个字符串,它包含文件中接下来的N个字符
file.readline() #读取下一个\n之前的内容并返回一个行字符串
file.readlines() #读取整个文件并返回一个行字符串列表
注意:
1.read()和readlines()把整个文件一次加载到内存,通常运行速度比较快,但是对于单性文件的读取将会占用大量内存。
使用迭代器读取行
在较早的版本中,借助for循环来逐行读取文件的传统做法是将文件读入列表,然后逐条读取。
#早期做法
my_file = open('/mnt/test_file', 'r')
for line in my_file.readlines():
print line
这个文件行迭代器不是一次性把整个文件加载到行列表,因此在处理大型文本文件时较为节省空间。
#使用迭代器进行处理
my_file = open('/mnt/test_file', 'r')
for line in my_file:
print (line, end='')
二进制和文本文件
python也可以打开并处理包含二进制数据的文件—jpeg图像、音频、视频和打包的二进制数据。
//打开视频文件
mv_file = open('/var/ftp/pub/我是谁:没有绝对安全的系统.BD1280高清德语中字.mp4', 'rb')
mv_file.read()
注意:把二进制文件的信息打印出来是没有太多意义的。
遍历目录树
遍历目录的方式
在python中我们可以使用3种方式来扫描目录:
1.使用os.popen运行shell列表命令;
2.使用glob.glob进行文件名模式匹配;
3.使用os.listdir得到目录的列表;
#使用 os.popen
import os
for line in os.popen('ls /root/Desktop/'):
print(line[:-1])
os.popen的缺点很明显,它需要使用平台专用的shell命令,在linux和windows的下的shell命令是不同的。而且需要启动一个独立的程序,从而导致性能下降。
使用glob可以得到文件的绝对路径:
#使用glob
import glob
for file in glob.glob('/root/Desktop/'):
print file
listdir则得到的是原始的基本文件名:
#使用listdir
import os
for file in os.listdir('/root/Desktop/'):
print file
遍历目录树
上述的例子中都是对单一的目录做遍历,那么如果目录中嵌套着更多的目录,我们需要怎么解决这个问题?
我们可以通过编写递归程序来遍历目录树,也可以使用python os模块的内建目录树遍历工具。
1.使用os.walk方式
#!/usr/bin/env python
#-*-coding:utf-8-*-
import os
def get_pdf_file(dirname):
matchs = []
for (dirname, dirshere, fileshere) in os.walk(dirname):
for filename in fileshere:
if filename.endswith('.pdf'):
pathname = os.path.join(dirname, filename)
matchs.append(pathname)
return matchs
def show_file(files):
for name in files:
print name
if __name__ == '__main__':
pdf_file = get_pdf_file('/root/Desktop/')
show_file(pdf_file)
上述列子获取了指定目录下的所有pdf文件,对该目录下的子目录也进行了同样的处理。
2.使用os.listdir递归遍历
使用os.listdir手动生成文件路径,并以递归方式调用自身
#!/usr/bin/env python
#-*-coding:utf-8-*-
import os
import sys
def my_list(dirname):
print ('[' + dirname + ']')
for file1 in os.listdir(dirname):
path = os.path.join(dirname, file1)
if not os.path.isdir(path):
print path
else:
my_list(path)
if __name__ == '__main__':
my_list('/root/Desktop/')
小结:
上述内容是关于python语言对于文件和目录的相关操作,希望大家可以掌握。