[Python基础]文件操作
一、Python File(文件) 方法
file_object = open(file_path [, access_mode][, buffering][, encoding= ''])
:open()函数创建一个file对象
file_object.write(string)
:write()方法不会在字符串的结尾添加换行符(’\n’),返回字符数
file_object.writelines( [ str ])
:向文件中写入一序列的字符串,如一个字符串列表。换行需要制定换行符 \n。
file_object.read([count])
:以字符串形式返回,count表示读取字符的个数。
file_object.readline()
:readline()方法用于从文件读取整行,包括"\n"字符。
file_object.readlines()
:以列表的形式返回该文件中包含的所有行(直到结束符 EOF),注意换行符是包含在每行的内容中.
file_object.close()
:刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
file_object.tell()
:返回指针在文件内的当前位置
file_object.seek(offset [,from])
:offset表示要移动的字节数,from设为0意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
file_object.flush();
:刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区
file_object.next()
:返回文件下一行
访问模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在末尾 | + | + |
file对象的属性 | 描述 |
---|---|
file.closed | 返回true如果文件已被关闭,否则返回false。 |
file.mode | 返回被打开文件的访问模式。 |
file.name | 返回文件的名称。 |
由于文件读写时都有可能产生IOError
,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally
来实现:
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
- Python引入了
with
语句来自动帮我们调用close()
方法。with会创建一个程序块,将文件操作置于with程序块下,这样with控制块结束,文件也会自动关闭。 - 调用
read()
会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)
方法,每次最多读取size个字节的内容 - 要读取二进制文件,比如图片、视频等等,用
'rb'
模式打开文件即可。 - 要读取非UTF-8编码的文本文件,需要给
open()
函数传入encoding
参数,如encoding='gbk'
- 遇到有些编码不规范的文件,你可能会遇到
UnicodeDecodeError
,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
- 在Windows下使用文件路径时,要注意字符’\’(反斜杠)在python中被视为转义字符,为确保万无一失,应以原始字符串的方式制定路径——在开头的引号前加上
r
- 读取文本文件时,python将其中所有文本都解读为字符串。如果要读取文件中数字并作为数值使用,就必须使用 int()、float() 等函数转化为对应类型数值
实例
path = "file_path" #如果文件与python脚本位于同一目录下,则只需写文件名,否则需要使用相对路径或绝对路径
#读取文件
with open(path, 'r', encoding='UTF-8') as f:
#读取整个文件
content = f.read().splitlines()#content为包含每行内容的列表
print(content)
#读取单行
content_1 = f.readline()#rstrip()方法删除string字符串末尾空白符,例如:/n, /r, /t, ' '。
print(content_1.rstrip())
content_2 = f.readline()
print(content_2.rstrip())
#按行读取
lines = f.readlines()
for line in lines:
print(line.rstrip())
#直接对文件进行迭代
for line in f:
print(line.rstrip())
去除换行符
file.read()
可以读取file文件的所有内容,但read()
到达文件末尾时返回一个空字符串,而这个字符串显示出来就是一个空行,readline()
,readlines()
方法也会读取文件中的换行符。
str.strip([chars])
:移除字符串头尾指定的字符,默认为空白符,例如:/n
, /r
, /t
, ' '
;当chars不为空时,函数会把chars解成一个个的字符,然后将这些字符去掉。
str.rstrip([chars])
:删除字符串末尾空白符
str.splitlines()
:按照行(\r
, \r\n
, \n
)分隔,返回一个包含各行作为元素的列表
str = str.replace(old, new[, max])
:python中字符串是不可变对象,故replace不会改变原string 的内容,在使用的时候我们必须重新赋值。
二、os模块
os.rename(src, dst)
:重命名文件,从 src 到 dst,如果dst是一个存在的目录, 将抛出OSError。
os.remove(file_name)
:删除指定路径的文件。如果指定的路径是一个目录,将抛出OSError。在Unix, Windows中有效
os.mkdir(path[, mode])
:以数字权限模式创建目录。默认的模式为0777 (八进制)。
os.chdir(path)
:改变当前目录(path为相对路径或绝对路径),成功则返回True
os.getcwd()
:显示当前Python脚本工作的目录路径
os.rmdir(dirname)
:删除目录,目录必须是空的
os.mknod(filename[, mode=0600[, device=0]])
:创建文件
os.path() 模块
建议使用 “import os” 风格而非 “from os import *”。这样可以保证随操作系统不同而有所变化的 os.open() 不会覆盖内置函数 open()。
os.path.exists(path)
:判断路径是否存在
os.path.isfile(path)
:判断是否是文件
os.path.isdir(path)
:如果path是一个存在的目录,返回True
os.path.join(path1[, path2[, ...]])
:路径拼接,如os.path.join(‘usr’, ‘local’,‘bin’)),输出usr\local\bin
os.path.normcase(path)
:windows平台路径字母全部转为小写,如果存在斜杆会转为反斜杠,其它平台不改变
os.path.split()
:将path分割成目录和文件名二元组返回
os.path.splitext()
:分离文件名与扩展名;默认返回(fname, fextension)元组,可做分片操作,以” . “为分隔符
os.path.dirname()
:返回path的目录,其实就是os.path.split(path)的第一个元素
os.path.basename()
:返回路径 path 的最后的文件名。
遍历目录
os.listdir()
方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。它不包括.
和..
即使它在文件夹中。只支持在 Unix, Windows 下使用。返回path目录下的文件夹和文件,但不包含子文件夹里的文件夹和文件,并按照目录树结构的排序输出结果,即深度优先。
os.walk(top, topdown=True, onerror=None, followlinks=False)
,通过“自上而下”或“自下而上”来遍历目录,生成目录树中的文件夹名和文件名。
top
:是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files
)。root
所指的是当前正在遍历的这个文件夹的本身的地址dirs
是一个 list ,内容是该文件夹中所有的目录的名字files
同样是 list , 内容是该文件夹中所有的文件
topdown
:可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。onerror
:onerror:默认情况下,walk函数会忽略掉遍历过程中的错误followlinks
:可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭)
os.walk()
的遍历过程:
- 先从根目录进行遍历,读取跟目录的文件夹和文件。
- 以根目录第一个子目录为新的根目录,读取其文件夹和文件。
- 再以步骤2中的第一个子文件夹为根目录,读取文件夹和文件。(应该是属于树结构里面的自上而下深度遍历算法)
- 读取步骤1里面其他子目录的文件夹和文件。
os.scandir(path)
,返回path目录树中对应的os.DirEntry
对象的迭代器而不是一个列表。,不包含子文件夹里的文件夹和文件,但运行效率比os.walk高。比如当一个文件夹里面的文件非常多的时候,比方说,上百万个文件的时候,使用listdir来获取每个文件的名称来做区别处理,速度回非常慢,那么可以使用os.scandir(path)
提高效率。
import os
def recursive_listdir(path):
files = os.listdir(path)
for file in files:
file_path = os.path.join(path, file)
if os.path.isfile(file_path):
print(file)
elif os.path.isdir(file_path):
recursive_listdir(file_path)
import os
cPath = os.getcwd()
#uPath = unicode(cPath,'utf-8')# 如果目录名字为中文 需要转码处理
paths = os.walk(cPath)
for path, dir_list, file_list in paths:
for dir_name in dir_list:#显示所有子目录
print(os.path.join(path, dir_name))
for file_name in file_list:
print(os.path.join(path, file_name))#显示目录下所有文件
import os
with os.scandir('my_directory') as entries:
for entry in entries:
print(entry.name)
针对日常的文件和目录管理任务,:mod:shutil
模块提供了一个易于使用的高级接口:
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
>>> shutil.move('/build/executables', 'installdir')