[Python基础]三、文件操作

[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]):以字符串形式返回。
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()的遍历过程:

  1. 先从根目录进行遍历,读取跟目录的文件夹和文件。
  2. 以根目录第一个子目录为新的根目录,读取其文件夹和文件。
  3. 再以步骤2中的第一个子文件夹为根目录,读取文件夹和文件。(应该是属于树结构里面的自上而下深度遍历算法)
  4. 读取步骤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')

扩展阅读

发布了54 篇原创文章 · 获赞 3 · 访问量 3658

猜你喜欢

转载自blog.csdn.net/magic_jiayu/article/details/104082000
今日推荐